javascript - 关闭输出查询

标签 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);

作者评论:

As expected, each call to bar(10) will increment x.memb. What might not be expected, is that x is simply referring to the same object as the age variable! After a couple of calls to bar, age.memb will be 2!

我很困惑为什么它总是返回 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/

相关文章:

javascript - 为什么不相关的元素会触发此点击事件?

javascript - 如何优化我的 javascript 代码?

javascript - 将鼠标悬停在一个元素上会使它产生动画,而不仅仅是改变它的 CSS 属性

swift - 捕获队列内的数组

java - 与 Objective-C block 相比,Java 匿名类的局限性

javascript - 在 webRTC 中切换摄像头

javascript - 释放 Javascript 中未附加的 DOM 节点使用的内存

r - 相当于 within(), attach() 等在一个环境中工作?

javascript - 使用 Node.js 的 Winston 模块正确记录到文件

jquery - jQuery .on() 应该在移动设备(iPhone Safari)上工作吗?