なぜvar foo = foo
投げないのReferenceError
ですか?
注:foo = foo
をスローしReferenceError
ます。
あなたが宣言するとき
var foo = ...
他の言語とは異なり、後でコードだけでなく、スコープ全体(グローバルでない場合は関数)の変数を宣言します。
したがって、割り当ての右側では、foo
まだ宣言されている場合でも、すでに宣言されていundefined
ます。参照エラーはありません。
javascriptのvar宣言のこのプロパティは、エラーの原因になる可能性があることに注意してください。あなたは(もっと複雑に)この種のコードを持っているかもしれないので:
if (true) {
var a = 3; // do you think this is "local" ?
}
var a;
alert(a); // a is 3, did you expect it ?
おそらく、変数宣言はJavascriptで持ち上げられています。これはコードを意味します
function bar() {
// some other code
var foo = foo;
}
と同等です:
function bar() {
var foo;
// some other code
foo = foo;
}
実際、次のように機能します。
function bar() {
return foo;
var foo;
}
(そして戻りますundefined
。)
JavaScriptはvar宣言を最上位にソートするため、割り当て時にすでに宣言されています(未定義の場合でも)。
var foo;
foo = foo;
varキーワードを使用する場合
var foo = foo
JavaScriptホイストはfooを作成し、コードが実行される前に未定義の値を割り当てます。したがって、ここではfooである任意の値を割り当てることができ、foo自体は未定義であるため、実際には、同じ変数を介してfooにundefinedを再度割り当てています。
あなたがしているとき
foo = foo
値を割り当てるために以前に定義された左側のfooがありません。
あなたがしているとき
var foo = bar
以前に定義されたバーがありません。