-4

同じ名前の 2 つの変数が見つかったときに google chrome が何をするかをさまよって まし。その ID は 'Cannon1' です) は正常に動作しますが、ゴールド コレクター (その ID は 'goldC1') を配置するとうまくいきません。

ノート:

「アラート」は、コードをテストするためのものです。このコードは、Firefox で実行すると機能します。Google Chrome のバージョンは 30.0.1599.101 です

ご不明な点がございましたら、お気軽にお問い合わせください。できるだけ早く回答いたします。よろしくお願いいたします。

4

1 に答える 1

8

Chrome、より正確には V8 は、 §10.5で仕様が指示していることを実行します(警告: 非常に重い作業です)

var

同じスコープで同じシンボルに対して複数のvar x;宣言がある場合、それは無関係であり、2 番目の宣言はまったく効果がありません。ただしvar x = 1;(たとえば、イニシャライザを使用すると) は実際 var x;にはであり、個別に. であることに注意してくださいx = 1;。繰り返すとその部分だけvar x;無視され、代入はそうではありません。

そう:

var x = 5;
var x;
console.log(x); // 5
var x = 42;
console.log(x); // 42

...そのコードは実際にこれを表しているため:

var x;
x = 5;
console.log(x); // 5
x = 42;
console.log(x); // 42

詳細:よく誤解var されている (ブログの記事)

関数宣言

同じスコープで同じ名前を使用する複数の関数宣言がある場合、最後のものが優先されます。

foo(); // "foo the second!"

function foo() {
    console.log("foo the first!");
}

function foo() {
    console.log("foo the second!");
}

関数宣言は関数とは異なります。以上が宣言です。これは、関数参照が式ですぐに使用されていないためです ( の右側にない、=別の関数に引数として渡されているなど)。関数宣言は、ステップバイステップ コードがまったく実行される前に、定義されているコンテキストに実行が入るときに発生します。

関数式

一方、関数は、他の式と同様に、段階的な実行がそれらに到達したときに処理されます。

//foo(); // This would be an error

var foo = function() {
    console.log("foo the first!");
};

foo(); // "foo the first!"

foo = function() {
    console.log("foo the second!");
};

foo(); // "foo the second!"
于 2013-10-29T18:20:30.447 に答える