我想定义一个函数数组,所以我尝试了下面的代码,但它没有预期的结果,因为循环中的i无法在其他地方检索。
<script>
var f = []
for (var i=0; i<1000; i++){
f[i] = function(){
return i
}
}
console.log(f[3]);
</script>
有蛮力的方法来编写1000行代码来定义函数,还有其他方法吗? 实际上我在Java中遇到了这个问题,Array of function pointers in Java ,所以Java或JS的答案都会有所帮助。
答案 0 :(得分:2)
在循环内使用一个立即执行的函数来创建一个范围,这样你就可以为每个函数实例提供一个变量:
var f = []
for (var i=0; i<1000; i++){
(function(i){
f[i] = function(){
return i;
}
})(i);
}
console.log(f[3]());
答案 1 :(得分:1)
这是一个闭包/范围问题,你必须锁定i的值
<script>
var f = [];
for (var i=0; i<1000; i++){
(function(j) {
f[j] = function(){
return j;
}
})(i); // passing as argument to IIFE makes it local to that scope
}
console.log(f[3]);
</script>