9
function Foo(f) {
   var f = f;    
}

ここで関数内では、変数fはローカルFoo(関数スコープを持っています) ですfが、引数リスト内の変数が競合していないのはなぜですか? Foo.argumentsオブジェクト内でバインドされているためでしょうか。

他の言語では、引数変数をローカル変数と同じ名前で宣言することはできません。

この名前のあいまいさはどのように解決されますか? fまたは、メソッドの後半で 2 つの異なる変数をそれぞれどのように参照しますか?

4

5 に答える 5

12

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 の下部) を参照してください。

于 2009-03-19T16:16:05.303 に答える
2

古い変数と同じ名前で新しい変数を宣言すると、それが上書きされ、両方を同時に参照することはできません。

パラメータまたは変数名を変更する必要があります。

于 2009-03-19T15:36:46.863 に答える
1

ここで、関数変数f内はFooに対してローカルです(関数スコープがあります)が、競合しない理由と同じ方法で名前が付けられた引数リスト内の変数fは、Foo.arguments内でバインドされているためである可能性があります物体?

いいえ、引数にバインドされていません。引数は位置引数値の配列にすぎず、そこから「arguments.f」を取得することはできません。

名前で関数に渡された引数はローカル変数になります。引数'f'を持つ関数の「varf」は暗黙的です。

すでにローカルになっている変数で「varf」を宣言しても、何も起こりません。コードは次のものと同じです。

function Foo(f)
{
    f = f;
}

他の言語では、ローカル変数と同じ名前の引数変数を宣言することはできません。

JavaScriptでは、スコープブロックで「varx」が1回使用されている限り、そのブロックでの「x」の使用はすべてローカルです。同じスコープ内の同じ変数で何度も何度も「var」を宣言できますが、何もしません。

于 2009-03-19T16:50:06.517 に答える