JavaScript は明らかに直感的ではないいくつかのことを行います - あなたが興味を持っているのは「巻き上げ」と呼ばれるものです - JS は var 宣言を関数の先頭に移動し、そこでこの変数名を予約するという唯一の目的を果たします。関数のスコープ内のローカル変数。時々、これは多くの奇妙なことにつながります。変数名がすでにローカル変数として予約されている場合 (たとえば、引数の場合)、var 宣言は完全に削除されます。
JS のもう 1 つの非直感的な部分は、引数変数とarguments
オブジェクト (Hippo が示したように、これらは少し特殊です) を処理する方法です。ただし、それは必ずしもあなたが興味を持っていることではありません-あなたの例で重要なのは、引数もその変数名を関数に対してローカルとして宣言することです。
このすべての結果はvar f
、引数 name と同様にa がある場合f
、「var f」が削除され、例は次のようになります。
function Foo(f) {
f = f;
}
これは、Hippo の例で確認できます。理由は次のとおりです。
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
var f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
以下と同等です。
function foo(f) {
var f;
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
以下と同等です。
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
詳細については、JS 仕様であるECMA-262のセクション10.1.3 - 変数のインスタンス化 (p.37 の下部) を参照してください。