+ 3

Javascript function return

function abc(a) { return (function(y) { return y + 1; }) (++a) + a } document.write(abc(2)) The output is 7 but I don't understand two things below: 1. 'return' part comes first even though it should be placed in the end; because it stops func execution. When I put '(++a) + a' in the beginning and 'return' part in the end of the func block, however, it doesn't work properly. 2. Based on the output, it seems that '(++a) + a' is assigned to y parameter. But why? Please someone help me grasp the whole flow of this code. Thanks in advance.

22nd Jan 2020, 5:28 AM
Eunjae Lee
Eunjae Lee - avatar
6 Answers
+ 8
This questions involves two JavaScript concepts: IIFE and ASI. Firstly, function(y){return y + 1;} itself is a function, when you wrap them with parenthesis, you are going to add another parenthesis to execute it. (function(y){return y +1;})(4) will be the same as function addOne(y){ return y+1; } addOne(4); that's the immediately-invoked function expression part. 2. for ending a line at }), as explained above, because it is IIFE, the compiler do not perform automatic semicolon insertion here; instead of ASI, it append the next line to the current line. 3. So the execution is return addOne(++a) + a. So noted that you are wrong in that the + a part also put into as y, actually only the (++a) because it is in parenthesis. 4. the variables changes a is 2, ++a is executed, a becomes 3, y is 3, 4 is returned, a is 3 now, so (4) + 3, so result is 7. 5. To Rai, Kuba's explanation is wrong.
22nd Jan 2020, 6:15 AM
Gordon
Gordon - avatar
+ 8
Gordon Masterfully and thoroughly answered. I can't find one thing wrong with your various points. I only wanted to add a link to a fantastic article I found a few years ago regarding ASI in Javascript. https://2ality.com/2011/05/semicolon-insertion.html
22nd Jan 2020, 6:48 AM
David Carroll
David Carroll - avatar
+ 3
The function in parentasis is an anonmymous function called with argument (++a). The return value of this function is then added to a. You can do a separate function for the nested function and name it for exemple "myFunction". The final result would look more clear : function abc(a) { return myFunction(++a) + a; }
22nd Jan 2020, 9:00 AM
Maher Najar
Maher Najar - avatar
+ 2
//In short it working like this //example code like above ((name)=>{ this.user = name console.log(user+'doe') })('john') //Please see this thread similar already answered https://www.sololearn.com/Discuss/1756451/function-abc-a-return-function-y-return-y-1-a-a-alert-abc-2 https://www.sololearn.com/Discuss/482453/?ref=app
22nd Jan 2020, 5:56 AM
Sudarshan Rai
Sudarshan Rai - avatar
+ 1
Thanks, Gordon. You're the best.
22nd Jan 2020, 6:32 AM
Eunjae Lee
Eunjae Lee - avatar
- 2
what have you written...?!đŸ˜±
22nd Jan 2020, 6:39 PM
Alireza Darvishi
Alireza Darvishi - avatar