对JavaScript闭包的误解

EML*_*EML 8 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());
Run Code Online (Sandbox Code Playgroud)

打印(在v8/d8中)a is 4; b is 5.如果我注释掉这var value;条线,我明白了a is 5; b is 5.'价值'对象在哪里,为什么有两个?谢谢.

Way*_*ett 12

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

删除var会在所有函数共享的对象上创建全局 .valuewindow

也许你的意思是这样做:

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

var addProperty = createPropertyMgr();
Run Code Online (Sandbox Code Playgroud)

无论调用多少次,这个新addProperty功能都会关闭一个value.我不确定我是否理解用例,但这应该证明了它的不同之处.

  • +1*source*中有一个`value`,但*memory*中有两个.这似乎是OP的混乱. (4认同)