for 循环作用域是否唯一

Is a for loops scope unique

我 运行 在执行一些技术债务职责时参与其中。变量 foo 的范围是什么?真的是"already defined"吗?

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

更新:问题是关于条件块中定义的变量的范围。因为它没有嵌套在 function/closure 中,所以没有唯一的范围。

这里有一个片段来说明:

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>"
              );

JavaScript 中在 if 或 for 内声明的变量可在声明的代码行 运行 之后在 if 或 for 外部访问。例如:

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

DoThing(); // returns 0;

在您提供的示例中,变量是在到达给定条件为真的 for 循环主体之后声明的,或者在 else 语句的主体中声明的。由于这些条件是相互排斥的,因此永远不会单独由该条件重新声明。然而,该变量将由它所在的循环重新声明。

也就是说代码不是很好读,我建议重构它,不要在 if 语句中嵌套 for 循环,并且不要在 if 和 else 中都声明一个新变量,更不用说了在 for 循环体内。

JavaScript 只有函数作用域,没有块作用域。所以你的变量 foo 存在于函数级别并且两个赋值都引用同一个实例。

var m = [ 1, 2, 3 ];
var x = fn(m, true);
WScript.Echo( x );
var x = fn(m, false);
WScript.Echo( x );

function fn(m, condition){
    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"
    }
    return foo;
}