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この意味ではまだ「保護」されています。ただし、同じ意味で「保護」されていない値でSomeClosureGetTheVar属性を上書きしています。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 に答える