0

技術的負債の仕事をしているときに、これに遭遇しました。変数のスコープはfoo? それは本当に「すでに定義されている」のですか?

function fn(){
    for (var i = 0; i < m.length; i++) {
        if(condition)
            for (var j = 0; j < m.length; j++) {
                var foo = "bar";
            }
        else 
            var foo = "fubar"
    }
}

更新: 問題は、条件付きブロック内で定義された変数の範囲に関するものです。これは関数/クロージャにネストされていないため、一意のスコープはありません。

説明するスニペットを次に示します。

var x = "foo",
    a = [];

for(var i=0;i<10;i++){
  var x = {value:1+i};
  a.push(x)
}

document.write("<pre>" + 
               x.value + "\n" + 
               JSON.stringify(a,null,"  ") + 
               "</pre>"
              );

4

2 に答える 2

1

if または for 内で宣言された JavaScript の変数は、宣言を含むコード行が実行された後、if または for の外でアクセスできます。例えば:

function DoThing() {
    for (var i = 0; i < 1; ++i)
        var x = 0;
    return x;
}

DoThing(); // returns 0;

あなたが提供した例では、条件が真である for ループの本体に到達した後、または else ステートメントの本体で変数が宣言されています。これらの条件は相互に排他的であるため、その条件だけで再宣言されることはありません。ただし、変数はループ内で再宣言されます。

とは言っても、コードは読みにくいので、if ステートメント内に for ループがネストされないようにリファクタリングすることをお勧めします。ループ用。

于 2016-05-10T18:40:25.490 に答える