2015-10-15 30 views
3

在下面的代碼中,有forEach循環使用的回調函數來檢查返回的結果。 forEach循環裏面的變量'error'和回調變量中的'error'?forEach循環中的JavaScript變量作用域

session.getAll(options, function (error, varbinds) { 
    varbinds.forEach(function (vb) { 
     if (error) 
      console.log('getALL Fail '); 
     else    
      console.log(vb.value);    
    }); 
}); 
+2

除非內功能範圍引入了一個新的「錯誤」變量,這將是相同的。 – rlemon

+1

您沒有定義任何其他的'error'變量,所以答案是**是**。 –

+1

正如其他人所說的是,如果它沒有在循環中用'var'重新定義,然而'forEach'循環不能中止。因此,在進入循環之前,應該在回調中檢查錯誤。如果您需要檢查循環中的任何原因,應該採用不同的循環方法。 – ste2425

回答

2

是的,這是相同的變量,如果你使用var關鍵字定義在foreach回調的範圍內的另一個error變量,它會改變:

session.getAll(options, function (error, varbinds) { 
    varbinds.forEach(function (vb) { 
     if (error) //Same error as the error parameter above 
      console.log('getALL Fail '); 
     else    
      console.log(vb.value);    
    }); 
}); 

session.getAll(options, function (error, varbinds) { 
    varbinds.forEach(function (vb) { 
     var error = false; //New error for this closure. 
     if (error) 
      console.log('getALL Fail '); 
     else    
      console.log(vb.value);    
    }); 
}); 
2

是的,這是相同的變量。

我不知道你知道多少。所以,我會詳細解釋一下。 JavaScript中的範圍確定處於功能級別。將函數定義看作樹上的點。樹上的每個點都是一個範圍。使用變量時,只能使用當前範圍內的內容以及祖先到頂端(全局範圍)時可用的內容。這裏有一些規則&例子,可以幫助您更好地理解:

內部函數可以訪問外部函數級的變量

function a() { 
    var a = 4; 

    function b() { 
     alert(a); /* a = 4 */ 
    } 
} 

參數在同一範圍定義爲,如果他們被定義下面

function a(a) { 
    // variable "a" is at same scope as the example above 

    function b() { 
     alert(a); 
    } 
} 

相鄰的功能之一線不可訪問

函數a()是父類。 getValue()和c()是它的孩子。這些孩子不能訪問彼此的變量。

function a() { 

    function getValue() { 
     var aValue = 2; 
    } 

    function c() { 
     alert(aValue); /* "aValue" is undefined here */ 
    } 
} 

定位功能的定義是什麼罪名

這將返回5,如果你運行main();

function getValue(returnFunc) { 
    var a = 7; 
    alert(returnFunc()); 
} 

function main() { 
    var a = 5; 
    getValue(function() { return a; }); // anonymous function becomes "returnFunc" 
} 

最後,可變首要

(function getValue() { 
    var a = 5; 

    (function() { 
     var a = 7; 
     alert(a); 
    })(); 

    alert(a); 
})(); 

我試圖避免爲這些示例使用自調用函數/ IIFE,但我無法幫助自己解決這個問題。我認爲這是最簡單的方法。運行此,你就會得到7,然後5.但是,如果排除對內部的「變種」,「一」 ...

(function getValue() { 
    var a = 5; 

    (function() { 
     a = 7; 
     alert(a); 
    })(); 

    alert(a); 
})(); 

你會得到7,7這是因爲「VAR」在記憶中創造一個新的空間。另外,如果名稱與較高範圍內的某個名稱發生衝突,它將作爲一個不同的變量被覆蓋(儘管名稱相同)。

對於一些更多的例子,請參閱:What is the scope of variables in JavaScript?