鍍金池/ 問答/HTML/ 關(guān)于自執(zhí)行函數(shù)的參數(shù)問題?

關(guān)于自執(zhí)行函數(shù)的參數(shù)問題?

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

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

}
arr[0]();//4
也是今天被問到的一個問題,就是匿名函數(shù)的參數(shù)有要求么,我以前的理解那個h只是一個形參,寫成什么都行。但是結(jié)果并不是想象的0,而是4.給h改成i之后結(jié)果變成了0.這是怎么回事了,那個h不應(yīng)該只是個形參么

回答
編輯回答
奧特蛋

console.log(h) 謝謝

console.log(i)的話,你寫的自動執(zhí)行函數(shù)就沒有意義了

2017年10月30日 07:04
編輯回答
離夢

這兩個函數(shù)都是匿名函數(shù),我就成為稱為函數(shù)和內(nèi)層函數(shù)好了
外層函數(shù)的形參為h,而你在外層函數(shù)體中并沒有使用到形參h,所以每次生成的內(nèi)層函數(shù)使用的都是最終的變量i。每次返回的都是function(){console.log(i)}。
而如果你使用如下形式:

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

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

那么每次外層函數(shù)自執(zhí)行時,h都不一樣,為數(shù)組當(dāng)前索引。 那么返回的內(nèi)層函數(shù)打印的h也不一樣。每次返回的是function(){console.log(0)},function(){console.log(1)}...

h換成i也是一個意思,外層函數(shù)的形參i覆蓋了循環(huán)的變量i。

2017年12月31日 23:23