鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ js閉包問題

js閉包問題

for(var i=0;i<10;i++){
    fnArr[i]=(function(){
        var n=i;
        return function(){
            return n
        }
    })();

}
for(var i=0;i<10;i++){
        (function(){
            var n=i;
        fnArr[i]=function(){
            return n
        };
        })()
    }

以上都是可以讓 fnArr[3]輸出3,而不是10,但是為什么一定都要聲明n=i呢?去了這句話 就不能正確輸出了

回答
編輯回答
脾氣硬

外層和內(nèi)層是兩個作用域,每次變量訪問都是訪問最近的,如果沒有var n = i這一句話,就訪問到頂級作用域了,而此時i已經(jīng)到10了

2017年4月18日 21:56
編輯回答
糖豆豆

如果不用var n=i接收i的值,直接返回i,那么后面函數(shù)運行的時候找不到i的值,就回去上層作用域?qū)ふ遥蠈幼饔糜蜓h(huán)結(jié)束,i的值為10,所以會始終返回10。

而使用了var n=i,想當于把每次循環(huán)中i的值保存在自調(diào)函數(shù)的內(nèi)部,返回函數(shù)運行的時候找不到n的值也會去上層作用域?qū)ふ?,找到了自調(diào)函數(shù)內(nèi)部的n的值,分別對應(yīng)0-9。

可以這么改,作用相同

for(var i=0;i<10;i++){ 
  fnArr[i]=(function(i){ 
    return function(){ 
      return i
    } 
  })(i); 
}
2018年2月21日 17:42