This question already has answers here:
JavaScript closure inside loops – simple practical example
                                
                                    (44个回答)
                                
                        
                2年前关闭。
            
        

    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 closure inside loops – simple practical example

但还是不明白

最佳答案

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

07-25 23:13