0

我在执行一些技术债务时遇到了这个问题。什么是变量foo的范围?它真的“已经定义”了吗?是一个for循环范围独特

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

回答

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

我正在寻找的确切答案,特别是块与功能范围。 – Shanimal

1

在JavaScript的变量内的声明,如果或者是可访问的外部如果或用于该行的代码具有声明之后已经运行。例如:

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

DoThing(); // returns 0; 

在这个例子中,你所提供的变量达到的体内循环给定的条件后声明是真实的,还是在其他语句体。由于这些条件是相互排斥的,因此不会单凭这一条件重新宣布。然而,该变量将由它所在的循环重新声明。

这就是说代码不是很好阅读,我建议重构它没有嵌套在if语句中的for循环,并且不在if和else中声明新变量,更不用说在内部for循环的主体。