Javascript:私有成员(使用关闭),为什么初始化访问私有成员后无法添加功能?

时间:2014-05-15 12:16:54

标签: javascript closures private

 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不是它然后返回对象的一部分(测试)?

提前感谢您提供的任何帮助。

1 个答案:

答案 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