2010-12-10 14 views
0

誰もがこの(グローバルスコープ内のコード)Javascriptがその人自身にグローバル変数を割り当てる

var a = a || 4 // a exists & is 4 
window.a = window.a || 4 // a exists & is 4 
window.a = a || 4 // a is undefined error 
a = a || 4 // a is undefined error 

差はこれら4つの割り当てと、なぜいくつかは、それを適切に扱うが、他にはないとの間にあるかの説明を説明することができます。

[編集]この特定の例は、V8 Chromeコンソールでテストされました。

答えて

4
var a = a || 4 // var a is evaluated at compile time, so a is undefined here 
window.a = window.a || 4 // window.a is simply undefined 
window.a = a || 4 // no var a, therefore the variable doesn't exist, = reference error 
a = a || 4 // again, no var, reference error 

var文は最も近いカプセル化スコープ内の変数/関数を宣言し、undefinedに設定します。 varがない場合、変数/関数はまったく宣言されていません。したがって、参照エラー。

いくつかの例。

function声明:

foo(); // works 
function foo() {} 

bar(); // TypeError: undefined is not a function 
var bar = function(){}; 

var声明:もちろん

function test(foo) {   
    if (foo) { 
     var bar = 0; // defined at compile time in the scope of function test 
    } else { 
     bar = 4; // sets the bar above, not the global bar 
    } 
    return bar; 
} 

console.log(test(false)); // 4 
console.log(bar); // ReferenceError 
+0

ここでの違いは、オブジェクトと宣言されていないオブジェクトに未定義のプロパティです。なぜコンパイル時に未定義ですが、実行時に宣言されませんか? – Raynos

+0

'var'ステートメントは、変数を最も近いカプセル化スコープで宣言し、' undefined'に設定します。 'var'がなければ、変数は全く宣言されていません。したがって、参照エラー。 –

+0

いいえ、私は 'var bar = 0'がコンパイル時に関数スコープで定義されていることを知りませんでした。なぜ私は2つではなく1つの 'var'ステートメントが必要なのですか? – Raynos

関連する問題