考虑以下代码片段:

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中传递值的基本知识,如果有人可以向我说明其工作原理,将不胜感激。

干杯!

最佳答案

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

但是,在第二个方法中,newObject作为o(新引用)传递给另一个方法,该方法在作用域内没有相同的变量,因为它不在for循环块中。

09-25 16:31