test = (function(){var key = 200;
return {getKey : function(){return key} };
})();
test.getKey() //returns 200, so far so good
test.setKey() = function(arg){key = arg};
test.setKey(400);
test.getKey() //still returns 200, setKey cannot access the private member "key"
现在,这种行为可能是一件好事。但它打破了我对封闭如何运作的直觉。不是匿名“私有函数和返回对象之间的链接吗?当我添加setKey不是它然后返回对象的一部分(测试)?
提前感谢您提供的任何帮助。
答案 0 :(得分:2)
以这种方式思考:闭包是对当前范围链的引用。只有引用相同范围的内容才会修改同一个变量。此部分是key
变量存在的范围:
{var key = 200;
return {getKey : function(){return key} };
}
您的set函数在此范围之外定义,因此修改了名为key
的另一个变量。闭包和范围未连接到对象。如果您希望以后能够添加set函数,则需要使变量成为对象的实际成员:
test = (function(){
return {key: 200, getKey : function(){return this.key} };
})();
test.getKey() //returns 200, so far so good
test.setKey = function(arg){this.key = arg};
test.setKey(400);
test.getKey() //returns 400