闭包输出查询

时间:2012-08-21 09:37:17

标签: javascript jquery closures

我正在阅读以下主题How do JavaScript closures work?,并找到了以下代码:

function foo(x) {
  var tmp = 3;
  return function (y) {
    alert(x + y + tmp);
    x.memb = x.memb ? x.memb + 1 : 1;
    alert(x.memb);
  }
}
var age = new Number(2);
var bar = foo(age); // bar is now a closure referencing age.
bar(10);

作者评论说:

  

正如预期的那样,对bar(10)的每次调用都会增加x.memb。什么可能   不能指望的是x只是指同一个对象   年龄变量!拨打几个电话后,age.memb将为2

我很困惑,为什么它会永远返回2。你能解释一下它将如何发生吗?

4 个答案:

答案 0 :(得分:2)

这里发生的是:foo返回一个函数,当调用它时,会将最初传入的对象的memb属性递增到foo。

将参数对象age作为一个简单的对象会更清楚;但是原作者可能在这里玩得很开心,所以传递一个新的数字 - 就Javascript而言,它与任何对象一样有效。

因此,当调用bar时,将创建/递增该Number对象上的memb属性。

该数字的“内部价值”保持不变;它始终是2.但是age.memb每次增加1。这就是作者的意思:

经过几次电话到酒吧,age.memb将是2!

这里的2指的是增加几次(即两次)之后的memb的值,它与刚开始的年龄恰好在的数字的值无关。再次拨打电话栏,age.memb为3。

答案 1 :(得分:0)

bar(10)引用了foo(2)

所以每次你打电话吧(10)。它将执行foo的内部函数(闭包) 将参数y设为10,因为bar的年龄参考为2.因此,如果您调用bar(10),则年龄将为2,根据提供的值,y将为10左右。即使外部函数不存在,闭包基本上也会保存对内部函数的引用。

答案 2 :(得分:0)

如果我理解正确,你会在条形图中获得一些像函数指针。这指向无名的功能。这个无名函数总是接收相同的输入,因为foo只被调用一次,即x永远不会改变。因此,无名函数中没有内存,总是为您提供x的输入值。

答案 3 :(得分:0)

它不会“永远”为2。

作者说:“经过几次拨打电话后,age.memb将为2” - 经过2次通话后,它将为“2”。

4次通话后,它将是4。

只需将其粘贴到firebug控制台:

function foo(x) {
  var tmp = 3;
  return function (y) {
    //console.log(x + y + tmp);
    x.memb = x.memb ? x.memb + 1 : 1;
    console.log(x.memb);
  }
}
var age = new Number(2);
var bar = foo(age); // bar is now a closure referencing age.
bar(10);
bar(10);
bar(10);
bar(10);

console.log('result: ', age.memb)    // result: 4