2015-10-15 31 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?