forEach循环内的JavaScript变量范围

时间:2015-10-15 17:19:51

标签: javascript scope

在下面的代码中,回调函数与forEach循环一起使用,返回结果。是变量'错误'在forEach循环和'错误'在回调相同的变量?

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

2 个答案:

答案 0 :(得分:4)

是的,它是同一个变量。

我不确定你知道多少。所以,我将详细解释。 JavaScript中的范围是功能级别*。将函数定义视为树上的点。树上的每个点都是一个范围。使用变量时,您只能使用当前范围内的内容和祖先可用的任何内容(全局范围)。这里有一些规则&可以帮助您更好地理解的示例:

*更新:ES6 constlet是块级

内部函数可以访问外部函数级变量

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

,则返回5
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"在内存中创建一个新空间。此外,如果名称与更高范围内的某些内容发生冲突,则会将其覆盖为另一个变量(尽管名称相同)。

有关更多示例,请参阅:What is the scope of variables in JavaScript?

答案 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);            
    });
});