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!"