我正在阅读以下主题 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);
作者评论:
As expected, each call to
bar(10)
will incrementx.memb
. What might not be expected, is thatx
is simply referring to the same object as the age variable! After a couple of calls to bar,age.memb
will be2
!
我很困惑为什么它总是返回 2。你能解释一下它怎么会总是 2 吗?
最佳答案
这里发生的事情是:foo 返回一个函数,当调用该函数时,会增加最初传递给 foo 的对象的 memb 属性。
参数对象age是一个简单的对象会更清楚;但原作者可能在这里很开心,因此传入一个新的 Number - 就 Javascript 而言,它与任何对象一样有效。
因此,当调用 bar 时,会创建/递增该 Number 对象上的 memb 属性。
该数字的“内部值”保持不变;它始终是 2。但是age.memb 每次都会增加 1。作者的意思是这样的:
After a couple of calls to bar, age.memb will be 2!
这里的2是指memb增加了几次(即两次)后的值,它与age刚开始时的Number的值无关。再次调用bar,age.memb为3。
关于javascript - 关闭输出查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12052060/