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循環的主體。