2014-05-15 27 views
0
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是不是它返回对象(测试)的一部分?Javascript:私人成员(使用闭包),为什么在初始化后不能添加功能访问私人成员?

在此先感谢您的任何帮助,您可以提供。

+0

变量属于在进入该上下文时创建的执行上下文,他们可以'稍后再添加。 – RobG

回答

2

认为它这样:A闭合是到当前范围链的基准只有一些东西,引用相同的范围将是修改相同的变量本节的范围,其中key变量存在:

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

您的设置功能是在此范围之外定义的d因此修改了一个名为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