我正在阅读以下主题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。你能解释一下它将如何发生吗?
答案 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