为什么在循环外部移动异步回调会改变结果?

时间:2015-12-15 09:02:03

标签: javascript asynchronous

请考虑以下代码段:

for(var i = 0; i < arr.length; ++i) {
    var newObject = new someFunction(arr[i]);
    //async callback function
    $http.get('someurl').then(
        function(data) {
            newObject.data = data;
        }
    );
}

VS

function registerCallbacks(o) {
    $http.get('someurl').then(
        function(data) {
            o.data = data;
        }
    );
}

for(var i = 0; i < arr.length; ++i) {
    var newObject = new someFunction(arr[i]);
    registerCallbacks(newObject);
}

第一个示例仅对数组中的最后一个对象执行异步操作,而第二个示例将按预期工作。 据我所知,在第一个例子中,回调都引用了同一个变量'newObject',因此只对一个对象起作用。 但是为什么在第二个例子中也不是这样呢? “o”最终不会引用最后一个函数调用的参数吗?

我担心我错过了一些关于如何通过javascript传递价值的基本信息,如果有人能够阐明我的工作原理,我将不胜感激。

干杯!

1 个答案:

答案 0 :(得分:2)

在第一个示例中,newObject对象在调用asynch callBack时可能不具有相同的值,因为其范围仍然在其父方法中,并且newObject的主要值将是由内部块使用。

然而,在第二个newObject被传递给另一个方法o(一个新的引用),它在范围内没有相同的变量,因为它超出了循环块的范围