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
来拥有一个将在循环中使用的块范围的变量。
顺便说一句,我希望 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]())
}