2011-09-19 16 views
0

誰かが私に説明することができます。なぜグローバルなインスタンスのメソッド値をローカルに設定するだけで上書きすることができますか、なぜ同様のことができないのですか?変数?JavaScript、MooTools - 変数/スコープの変数/グローバル変数

windowオブジェクト階層を使用するために変数にアクセスする唯一の方法はありますか?それとももっと短い方法がありますか?

(function() { 
    console.log(this); 

    var someVar = this.someVar = false; 

    var subClass = new Class({ 
     test: false, 

     setValue: function(value) { 
      this.test = value 
     } 
    }); 

    var subPub = this.subPub = new subClass(); 

    var MainClass = new Class({ 
     rewriteVar: function() { 
      console.log("someVar = " + someVar); // returns global value 
      console.log("subPub.test = " + subPub.test); // returns global value 

      someVar = true; 

      console.log("someVar local: " + someVar); // returns new local value 
      console.log("someVar global: " + window.someVar); // returns old global value 

      subPub.setValue(true); 

      console.log("subPub.test local: " + subPub.test); // returns new local value 
      console.log("subPub.test global: " + window.subPub.test) // returns new global value 
     } 
    }); 

    /* var someObj = this.someObj = {}; 

    var someVar = someObj.someMeth = false; 

    // And why is this possible? 
     var MainClass = new Class({ 
      rewriteVar: function() { 
      someObj.someMeth = true; 
      console.log(window.someObj.someMeth); // returns new global value 
     } 
    }); */ 

    window.addEvent("load", function() { 
     var test = new MainClass(); 
     test.rewriteVar() 
    }) 
})() 
+1

:あなたはVARキーワードを使用する場合は、関数定義内で宣言

変数は、その関数に対してローカルです。プリミティブ値はすべて不変です。 –

答えて

0

(私が正しく問題を理解している場合)

それはMooToolsはまたはclasesとは何の関係もない、@Felix_Klingはすでにあなたに答えを与えたが、私は簡単な例でそれをilustrateます:

var aObj = bObj = {}; //since bObj is an 'object', aObj will store the objects reference 
aObj.foo = "bar"; 
console.log(aObj.foo); 
console.log(bObj.foo); 
// output: 
//  "bar" 
//  "bar" 


var a = b = 1; //since 'b' is primitive, 'a' will not store a reference of 'b', it will only copy it's value 
a = 0; 
console.log(a); 
console.log(b); 
// output: 
//  0 
//  1 

私は=これは、あなたが求めていたものであるならば、本当にわからないが)、これは

+0

ありがとう、これは私の多くを助けます。 =) – headacheCoder

1

これは、変数のスコープで行うことですお役に立てば幸いです。 Javascriptに機能範囲があります。

var someVar = this.someVar = false; 

をあなたがグローバルスコープにあなたの閉鎖referes内このように、ローカル変数SOMEVARと(window.someVarすなわち、ウィンドウオブジェクトに掲揚されます)グローバル変数を宣言している。そうすることによって

すなわちウィンドウ。

ですから、書くとき:

someVar = true; 

あなたはこの新しい値をローカル変数を上書きしています。あなたがオブジェクトの他のプロパティで、プリミティブな値を保持する変数を変更している一つのケースでは

(function() { 
    var name = 'Mark'; 
})(); 
// Out here you cannot access name 
console.log(name); 
関連する問題