JavaScript闭包 - 数组,无法理解结果(简单示例)


    var arr = []
    for(var i=0; i<5; i++){
        arr[i] = function(){
            return i;
        }
    }
    for(var index in arr){
        document.write(arr[index]())};

我期望看到的是 12345,但结果是 55555

让我用'//'来解释我的逻辑

    var arr = []                   // creating array new object
    for(var i=0; i<5; i++){            
        arr[i] = function(){
            return i;
        }             
    // arr = [function(){return 0}, function(){return 1}, function(){return 2}, function(){return 3}, function(){return 4}
    }
    for(var index in arr){
        document.write(arr[index]())};
    // outcome is 12345

我已经读过这篇文章 循环中的JavaScript闭包 - 简单的实际示例,

但还是看不懂。.

这是因为在你的 for 循环中,var i不是块范围的。这意味着,您可以在循环外访问i。因此,在返回 i 的循环中创建函数并在外部执行这些函数后,它将具有 i = 5 ,因为这是您分配给i的最后一个值。您需要使用 let 而不是 var 来拥有一个将在循环中使用的块范围的变量。

问题是,当调用这些函数中的任何一个时,i 是 5

顺便说一句,我希望 01234 作为输出

在新浏览器(不是互联网爆炸器(中,您可以简单地更改 var i 以让 i

var arr = []
for(let i=0; i<5; i++){
    arr[i] = function(){
        return i;
    }
}
for(var index in arr){
    console.log(arr[index]())
}

但这对互联网爆炸器没有帮助 - 所以,通过一个音译器(例如 babel(运行它,你会得到

"use strict";
var arr = [];
var _loop = function _loop(i) {
    arr[i] = function () {
        return i;
    };
};
for (var i = 0; i < 5; i++) {
    _loop(i);
}
for(var index in arr){
    console.log(arr[index]())
}

相关内容