看看这段代码:
var arr = new Array();
for (var i = 0; i < 10; i++) {
arr[i] = {
func:function() {
console.log(i);
}
}
}
arr[0].func();
我对此感到困惑,因为我认为这会有效。我基本上希望数组中的每个对象都打印在创建函数时给出的值。
现在,当我呼叫func()
时,它会在控制台中打印10。有没有办法让它打印0, 1, 2, 3, 4, 5, 6, 7, 8, 9
?谢谢!
答案 0 :(得分:1)
问题在于里面的函数是引用变量&#39; i&#39;每次增加。您可以存储&#39; i&#39;在对象的每次迭代中,以及像这样的函数:
var arr = new Array();
for (var i = 0; i < 10; i++) {
arr[i] = {
func:function() {
console.log(this.value);
},
value: i
}
}
arr[0].func();
答案 1 :(得分:0)
您必须创建一个封装来封装该值。我在这里呼叫consoleIt
并传递i
。 consoleIt
围绕i
var arr = [];
function consoleIt (i) {
return function () {
console.log(i);
}
};
for (var i = 0; i < 10; i++) {
arr[i] = {
func: consoleIt(i)
};
}
arr[0].func();
答案 2 :(得分:0)
这并不比thebreiflabb的做法更好,但这是一项值得了解的有趣技术:
var arr = [];
for (var i = 0; i < 10; i++){
(function(i){
arr[i] = {
func : function(){
console.log(i);
}
};
})(i);
}
arr[0].func();
它只使用匿名闭包来限制i。