0

我使用的显示模块模式有点像这样:

var SomeClosure = function () {

  var SomeInnerVar = 4;

  function InnerGetTheVar() {
     return SomeInnerVar;
  } 

  function InitClosure() {
       // there's something else happening here that requires me to 
       // wait for document.ready before initializing the closure
       setInterval(IncreaseSomeInnerVar, 10000);
  }

  function IncreaseSomeInnerVar() {
     SomeInnerVar = SomeInnerVar  + 1;
  }

  InitClosure();

  return  {
     GetTheVar: InnerGetTheVar
  }
}

$(document).ready(function () {

   SomeClosure = SomeClosure();
}); 

现在为什么如果在控制台中输入以下内容:

SomeClosure.GetTheVar = 2;
SomeClosure.GetTheVar; // outputs 2!

为什么关闭不保持SomeInnerVar保护?我不希望外部范围能够像那样更改 SomeInnerVar。

感谢您的建议。

4

2 回答 2

2

实际上,SomeInnerVar在这个意义上,仍然是“受保护的”。但是,您正在用 value 覆盖SomeClosure'sGetTheVar属性2,这在同样的意义上不是“受保护”的。换句话说,你不是在修改SomeInnerVar,而是在修改GetTheVar

于 2012-08-27T00:26:09.117 回答
1

而不是仅仅返回一个对象文字,使用Object.defineProperty

var out = {};

if ( Object.defineProperty ) {
    Object.defineProperty(out, 'GetTheVar', {
        value: InnerGetTheVar,
        writable: false
    });
} else {
    out.GetTheVar = InnerGetTheVar;
}

return out;
于 2012-08-27T00:31:35.870 回答