【问题标题】:Is a for loops scope uniquefor 循环范围是否唯一
【发布时间】:2016-09-05 21:22:48
【问题描述】:

我在履行一些技术债务职责时遇到了这个问题。变量 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 没有嵌套在函数/闭包中,因此没有唯一的范围。

这里有一个sn-p来说明:

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

【问题讨论】:

    标签: scope refactoring jshint variable-declaration technical-debt


    【解决方案1】:

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

    【讨论】:

    • 我正在寻找的确切答案,特别是块与函数范围。
    【解决方案2】:

    在 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 循环,并且不在 if 和 else 中声明新变量,更不用说在for 循环的主体。

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2012-03-05
      相关资源
      最近更新 更多