Es5
function box(){ var arr = []; for(var i=0;i<5;i++){ arr[i] = (function(num){ //自我執行,並傳參(將匿名函數形成一個表達式)(傳遞一個參數) return num; //這里的num寫什么都可以 })(i); //這時候這個括號里面的i和上面arr[i]的值是一樣的都是取自for循環里面的i } return arr; }
在for循環里面的匿名函數執行 return i 語句的時候,由於匿名函數里面沒有i這個變量,所以這個i他要從父級函數中尋找i,而父級函數中的i在for循環中,當找到這個i的時候,是for循環完畢的i,也就是5,所以這個box得到的是一個數組[5,5,5,5,5]。
ES6
function box(){ var arr = []; for(let i=0;i<5;i++){ //使用let聲明塊級變量 arr[i] = function(){ return i; } } return arr; } var b = box(); alert(b[0]()); //0
function box(){ var arr = []; for(var i=0;i<5;i++){ arr[i] = (function(num){ //自我執行,並傳參(將匿名函數形成一個表達式)(傳遞一個參數) return num; //這里的num寫什么都可以 })(i); //這時候這個括號里面的i和上面arr[i]的值是一樣的都是取自for循環里面的i } return arr; }