javascript - 为什么将异步回调移出循环会改变结果?

标签 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;
        }
    );
}

对比

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 中传递值的基本知识,如果有人能向我解释它是如何工作的,我将不胜感激。

干杯!

最佳答案

在第一个示例中,newObject 对象在调用异步回调时可能没有相同的值,因为它的作用域仍在其父方法中,并且 newObject 的主要值 将被内部 block 使用。

然而,在第二个中 newObject 被传递给另一个方法作为 o (一个新的引用),它在范围内没有相同的变量,因为它在外部那个 for 循环 block 。

关于javascript - 为什么将异步回调移出循环会改变结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34284881/

相关文章:

javascript - Sequelize : How to log raw query

javascript - 如何在元素的单击时将 id 从一个组件传递到另一个组件

javascript - Jquery 获取选择器

javascript - 添加和删​​除 jquery li 元素

javascript - Angular.js Controller 在 View 之后加载

java - 带有 mongodb bson 库的 Mongodb 驱动程序在单独的项目中使用时会导致 completableFuture 挂起

.net - 如何在 .net 内存转储中列出正在运行的任务

javascript - Backbone.js 可以在集合的添加处理程序中调用 View 上的方法吗?

apache-flex - ActionScript:事件处理程序何时执行?

PHP异步执行