for(var i=0,arr=[];i<=3;++i) {
arr.push(
(function(h){
return function(){
console.log(i);
}
})(i)
);
}
arr[0]();//4
也是今天被问到的一个问题,就是匿名函数的参数有要求么,我以前的理解那个h只是一个形参,写成什么都行。但是结果并不是想象的0,而是4.给h改成i之后结果变成了0.这是怎么回事了,那个h不应该只是个形参么
for(var i=0,arr=[];i<=3;++i) {
arr.push(
(function(h){
return function(){
console.log(i);
}
})(i)
);
}
arr[0]();//4
也是今天被问到的一个问题,就是匿名函数的参数有要求么,我以前的理解那个h只是一个形参,写成什么都行。但是结果并不是想象的0,而是4.给h改成i之后结果变成了0.这是怎么回事了,那个h不应该只是个形参么
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
3 回答1.3k 阅读✓ 已解决
这两个函数都是匿名函数,我就成为称为函数和内层函数好了
外层函数的形参为
h
,而你在外层函数体中并没有使用到形参h
,所以每次生成的内层函数使用的都是最终的变量i
。每次返回的都是function(){console.log(i)}
。而如果你使用如下形式:
那么每次外层函数自执行时,
h
都不一样,为数组当前索引。 那么返回的内层函数打印的h
也不一样。每次返回的是function(){console.log(0)}
,function(){console.log(1)}
...把
h
换成i
也是一个意思,外层函数的形参i
覆盖了循环的变量i
。