Javascript:私有成员(使用闭包),为什么可以';初始化后添加的t函数是否访问私有成员?

Javascript:私有成员(使用闭包),为什么可以';初始化后添加的t函数是否访问私有成员?,javascript,closures,private,Javascript,Closures,Private,现在,这种行为可能是一件好事。但这打破了我对闭包工作原理的直觉。匿名“私有”函数和返回对象之间的链接不是吗?当我添加setKey时,它不是返回对象(test)的一部分吗 提前感谢您提供的任何帮助。请这样想:闭包是对当前作用域链的引用。只有引用相同作用域的东西才会修改相同的变量。此部分是键变量存在的作用域: test = (function(){var key = 200; return {getKey : function(){return key} }; })()

现在,这种行为可能是一件好事。但这打破了我对闭包工作原理的直觉。匿名“私有”函数和返回对象之间的链接不是吗?当我添加setKey时,它不是返回对象(test)的一部分吗


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

请这样想:闭包是对当前作用域链的引用。只有引用相同作用域的东西才会修改相同的变量。此部分是
变量存在的作用域:

 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"
您的set函数在此范围之外定义,因此会修改名为
key
的不同变量。闭包和作用域未连接到对象。如果您希望以后能够添加set函数,则需要将该变量设置为对象的实际成员:

{var key = 200; 
  return {getKey : function(){return key} };          
 }

变量属于在进入该上下文时创建的执行上下文,以后不能添加。
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