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
ここでの違いは、オブジェクトと宣言されていないオブジェクトに未定義のプロパティです。なぜコンパイル時に未定義ですが、実行時に宣言されませんか? – Raynos
'var'ステートメントは、変数を最も近いカプセル化スコープで宣言し、' undefined'に設定します。 'var'がなければ、変数は全く宣言されていません。したがって、参照エラー。 –
いいえ、私は 'var bar = 0'がコンパイル時に関数スコープで定義されていることを知りませんでした。なぜ私は2つではなく1つの 'var'ステートメントが必要なのですか? – Raynos