javascript - 如何在循环中的回调中引用正确的值 `i`?

标签 javascript

我有这段代码:

for (var i = 0; i < result.length; i++) {
    // call a function that open a new "thread"
    myObject.geocode({ param1: "param" }, function(results, status) {
        alert(result.title[i]);
    });                                             
}

.geocode 函数(不是我的,所以我无法编辑)打开一个新的执行“线程”。

当我尝试在每个步骤上打印标题时,我总是得到 i 的最后可能值。

如何为每次迭代保留对 i 正确值的引用?

最佳答案

您可以在循环内创建一个闭包;

for (var i = 0; i < result.length; i++) {
    // call a function that open a new "thread"
    (function (i) {
        myObject.geocode({ param1: "param" }, function(results, status) {
            alert(result.title[i]);
        });
    }(i));                                             
}

所以我们在这里创建一个函数;

(function (i) {
    myObject.geocode({ param1: "param" }, function(results, status) {
        alert(result.title[i]);
    });
});

...接受一个名为i 的参数,并启动地理编码请求。通过将 (i) 添加到函数表达式声明的末尾,我们可以立即运行该函数并将 i 的当前值传递给它。

(function (i) {
    myObject.geocode({ param1: "param" }, function(results, status) {
        alert(result.title[i]);
    });
}(i));

变量 i 已经存在于比闭包更高的作用域并不重要,因为 i 的局部声明覆盖了它。我们传递闭包的变量,或者闭包调用变量的名称可能不同;

(function (anotherVariable) {
    myObject.geocode({ param1: "param" }, function(results, status) {
        alert(result.title[anotherVariable]);
    });
}(aVariable));

或者您还可以将逻辑提取到另一个函数(我更喜欢它,但它没那么):

function geocode(i) {
   myObject.geocode({ param1: "param" }, function(results, status) {
       alert(result.title[i]);
   });
}

for (var i = 0; i < result.length; i++) {
    geocode(i);                                            
}

问题在于回调函数使用了same i 变量;正如您所发现的那样,在执行回调时它已经继续前进。上述两种解决方案都为每次迭代创建了另一个变量,回调操作的正是这个变量。

关于javascript - 如何在循环中的回调中引用正确的值 `i`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9179862/

相关文章:

javascript - Google map 内容未显示在 Bootstrap 模态视图中

javascript - 仅在提交时重新加载此表单或 div

javascript - Angular.js 中是否有任何事件 "on $scope digest finished"或 "on view refreshed"?

javascript - rails 和 CORS : why am I only seeing the OPTIONS request?

javascript - 使用javascript从下拉列表中删除重复项

javascript - 使用javascript获取位图的像素

javascript - Node.js 刮板中的内存泄漏

JavaScript 函数每次运行时循环次数是原来的两倍

javascript - 如何从附加到 Puppeteer 页面的 pageerror 监听器捕获错误?

javascript - 检查显示是否支持 JavaScript 中的 HDR(高动态范围)颜色?