【问题标题】:Javascript: Private Members (using closure), why can't functions added after initialization access private members?Javascript:私有成员(使用闭包),为什么初始化后添加的函数不能访问私有成员?
【发布时间】:2014-05-15 12:16:53
【问题描述】:
 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"

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

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

【问题讨论】:

  • 变量属于进入该上下文时创建的执行上下文,以后无法添加。

标签: javascript closures private


【解决方案1】:

这样想:闭包是对当前作用域链的引用。只有引用相同范围的东西才会修改相同的变量。这部分是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

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 2021-11-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2016-11-29
    相关资源
    最近更新 更多