0

我正在阅读以下主题JavaScript 闭包如何工作?并找到了这段代码:

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.memb2

我很困惑为什么它总是会返回 2。你能解释一下它是怎么来的 2 总是吗?

4

4 回答 4

2

这里发生的情况是: foo 返回一个函数,该函数在调用时会增加最初传入 foo 的对象的 memb 属性。

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

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

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

在几次调用 bar 之后,age.memb 将是 2!

这里的 2 是指 memb 增加了几次(即两次)后的值,与 age 刚开始时的 Number 的值无关。再次调用 bar,age.memb 将为 3。

于 2012-08-21T09:49:35.750 回答
0

bar(10) 引用了 foo(2)

所以每次你调用 bar(10)。它将执行 foo 的内部函数(闭包),其参数 y 为 10,并且由于 bar 的年龄参考为 2。因此,如果您调用 bar(10),则年龄将始终为 2,而 y 将根据值约为 10提供。即使外部函数不存在,闭包基本上也会保存对内部函数的引用。

于 2012-08-21T09:43:24.373 回答
0

如果我理解正确,您会在 bar 中获得类似函数指针的东西。这指向无名函数。这个无名函数总是接收相同的输入,因为 foo 只被调用一次,即 x 永远不会改变。结果,在无名函数中没有内存,因此始终为您提供 x 的输入值。

于 2012-08-21T09:49:15.903 回答
0

它不会“总是”为 2。

作者说:“在几次调用 bar 之后,age.memb 将是 2” - 在 2 次调用之后它将是“2”。

4 次通话后,它将是 4 次。

只需将其粘贴到萤火控制台:

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
于 2012-08-21T09:49:39.103 回答