在下面的代码中,回调函数与forEach循环一起使用,返回结果。是变量'错误'在forEach循环和'错误'在回调相同的变量?
session.getAll(options, function (error, varbinds) {
varbinds.forEach(function (vb) {
if (error)
console.log('getALL Fail ');
else
console.log(vb.value);
});
});
答案 0 :(得分:4)
是的,它是同一个变量。
我不确定你知道多少。所以,我将详细解释。 JavaScript中的范围是功能级别*。将函数定义视为树上的点。树上的每个点都是一个范围。使用变量时,您只能使用当前范围内的内容和祖先可用的任何内容(全局范围)。这里有一些规则&可以帮助您更好地理解的示例:
*更新:ES6 const
和let
是块级
内部函数可以访问外部函数级变量
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()是父级。 b()和c()是它的孩子。那些孩子无法互相访问其他人的变量。
function a() {
function b() {
var aValue = 2;
}
function c() {
alert(aValue); /* "aValue" is undefined here */
}
}
功能定义的位置是重要的
如果您运行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.但是,如果你排除" var"在那个内心" a" ...
(function getValue() {
var a = 5;
(function () {
a = 7;
alert(a);
})();
alert(a);
})();
你得到7,7。这是因为" var"在内存中创建一个新空间。此外,如果名称与更高范围内的某些内容发生冲突,则会将其覆盖为另一个变量(尽管名称相同)。
答案 1 :(得分:3)
是的,它是相同的变量,如果您使用error
关键字在forEach回调范围内定义另一个var
变量,它会发生变化:
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);
});
});