关于自执行函数的参数问题?

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不应该只是个形参么

阅读 2.4k
2 个回答

这两个函数都是匿名函数,我就成为称为函数和内层函数好了
外层函数的形参为h,而你在外层函数体中并没有使用到形参h,所以每次生成的内层函数使用的都是最终的变量i。每次返回的都是function(){console.log(i)}
而如果你使用如下形式:

for(var i=0,arr=[];i<=3;++i) {

arr.push(
  (function(h){
    return function(){
      console.log(h);
    }
  })(i)
);
}

那么每次外层函数自执行时,h都不一样,为数组当前索引。 那么返回的内层函数打印的h也不一样。每次返回的是function(){console.log(0)},function(){console.log(1)}...

h换成i也是一个意思,外层函数的形参i覆盖了循环的变量i

console.log(h) 谢谢

console.log(i)的话,你写的自动执行函数就没有意义了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题