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

更新:问题是关于条件块中定义的变量的范围。由于 this 没有嵌套在函数/闭包中,因此没有唯一的范围。

这是一个片段来说明:

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

2

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;
}
于 2016-05-10T19:02:02.987 回答
1

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 中声明新变量,更不用说在 a 的主体中了for 循环。

于 2016-05-10T18:40:25.490 回答