javascript - 对 JavaScript 闭包的误解

标签 javascript closures

我是 JavaScript 的新手,在理解这段代码时遇到问题:

function addProperty(o) {
   var value;

   o["get"] = function()  { return value; }
   o["set"] = function(v) { value = v; }
}

var a = {};
addProperty(a);
var b = {};
addProperty(b);

a.set(4);
b.set(5);
print("a is " + a.get() + "; b is " + b.get());

这会打印(在 v8/d8 中)a is 4; b 为 5。如果我注释掉 var value; 行,我得到 a is 5; b 是 5。 “值”对象在哪里,为什么有两个?谢谢。

最佳答案

value 变量是 addProperty 的本地变量。第一次调用 addProperty 时,会创建一个新的 value,这两个函数都会关闭。第二次 addProperty 被调用时,第二个 value 被创建,两个新函数关闭。

删除 var 会在所有函数共享的 window 对象上创建一个global value

也许你的意思是这样做:

function createPropertyMgr() {
    var value;
    return function(o) {
       o["get"] = function()  { return value; }
       o["set"] = function(v) { value = v; }
    }
}

var addProperty = createPropertyMgr();

无论调用多少次,这个新的 addProperty 函数都会关闭一个 value。我不确定我是否理解用例,但这应该可以证明差异。

关于javascript - 对 JavaScript 闭包的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8728946/

相关文章:

javascript - 使用 firebase 函数 onCall 在 firestore 中进行 CRUD 数据。其中的任何异步操作(Promise)会发生什么?

javascript - 机场的 Google Places 自动完成功能

Swift 可选的转义闭包

xcode - Swift:来自 switch 语句的未解析标识符

swift - 捕获的弱引用指向错误的对象

javascript - jQuery 手机 : Applying style after reloading content

javascript - 检测用户访问哪些社交网络的方法?

javascript - 闭包和回调

rust - 为什么这个闭包没有实现Fn?

javascript - Cyclejs 并通过 x 和 y 移动元素