Anton Kim
Anton Kim

Reputation: 943

JavaScript Closure - trying to understand following code

Coming from Java background trying to make sense out of the following code.

From: https://medium.freecodecamp.com/lets-learn-javascript-closures-66feb44f6a44#.cbk6c4e9g

For function bar(c), which line passes argument c into bar(c) as I don't see it here.

Thanks.

var x = 10;
function foo(a) {
  var b = 20;

  function bar(c) {
    var d = 30;
    return boop(x + a + b + c + d);
  }

  function boop(e) {
    return e * -1;
  }

  return bar;
}

var moar = foo(5); // Closure  
/* 
  The function below executes the function bar which was returned 
  when we executed the function foo in the line above. The function bar 
  invokes boop, at which point bar gets suspended and boop gets push 
  onto the top of the call stack (see the screenshot below)
*/
moar(15);

Upvotes: 0

Views: 64

Answers (2)

Ben Aston
Ben Aston

Reputation: 55729

moar(15) passes 15 into bar which gets copied into parameter c.

The // Closure comment is misleading because it is more useful to think of the closure being configured at the point of declaration of a function.

The reality is that the pointer to the outer lexical environment is configured when a function object is instantiated, and then this pointer is then copied to the execution context associated with any invocations of said function object.

Upvotes: 1

Geeky
Geeky

Reputation: 7488

When your first statement of function call var moar = foo(5) is executed moar variable will be function bar(c){var d=30;return boop(x+a+b+c+d);

check the snippet for understanding

var x = 10;
function foo(a) {
  var b = 20;

  function bar(c) {
    var d = 30;
    return boop(x + a + b + c + d);
  }
  return bar;
}

var moor=foo(10);
console.log(moor);

2.After this statement moar(15),your are actually passing 15 to the bar method

It will execute bar method with c as 15. Now this function would return boop(80) which would just be -80

var x = 10;
function foo(a) {
  var b = 20;

  function bar(c) {
    var d = 30;
    return boop(x + a + b + c + d);
  }

  function boop(e) {
    return e * -1;
  }

  return bar;
}

var moar = foo(5)
console.log(moar(15));

Hope it helps

Upvotes: 1

Related Questions