3

なぜvar foo = foo投げないのReferenceErrorですか?

注:foo = fooをスローしReferenceErrorます。

4

4 に答える 4

5

あなたが宣言するとき

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 ?
于 2012-10-24T20:48:21.483 に答える
2

おそらく、変数宣言は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。)

于 2012-10-24T20:51:31.150 に答える
1

JavaScriptはvar宣言を最上位にソートするため、割り当て時にすでに宣言されています(未定義の場合でも)。

var foo;
foo = foo;
于 2012-10-24T20:49:02.933 に答える
0

varキーワードを使用する場合

var foo = foo

JavaScriptホイストはfooを作成し、コードが実行される前に未定義の値を割り当てます。したがって、ここではfooである任意の値を割り当てることができ、foo自体は未定義であるため、実際には、同じ変数を介してfooにundefinedを再度割り当てています。

あなたがしているとき

foo = foo

値を割り当てるために以前に定義された左側のfooがありません。

あなたがしているとき

var foo = bar

以前に定義されたバーがありません。

于 2012-10-24T20:58:55.407 に答える