我是 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/