為什麼會輸出10 次10 push進去的不應該是 1 - 9嗎 這個坑求大神解
function save_i(){
var a = [];
for(var i = 0;i<10;i++){
a[i] = function(){
return i;
}
}
return a;
}
var c = save_i();
for(var i = 0;i<10;i++){
console.log(c[i]());
//10次 10
}
只需要在for迴圈執行時,建立一個閉包函數將i值儲存起來,既可以依序輸出
之前過基礎看過的文章
理解閉包,要求你寫過一程式碼,而且接下來在自己的程式碼中也能用到,除些之外,就只能死記硬背了。
老派的國人喜歡讓小孩子很小的時候背東西,但是不會和他們講是什麼意思,有時也講不清,寄希望於在未來的某個時刻自然而然就懂了
以上
如果你有一定基礎,推薦看我寫的日誌,再不懂,留言問我
http://user.qzone.qq.com/2084...
雷雷
return的每個i都是引用了外部的同一個i 也就是10
var變數的作用域是函數作用域,不是區塊級作用域
作用域鏈在創建的時候就已經生成了,
c[i] = function(i){ return i; };
運行的時候當前作用域沒有i,而上層作用域save_i()的i已經變成10。你認為結果是0~9,是不是你把上層作用域當作全域了a[i]賦值的時候是一堆function、也就是並沒有執行、也沒有拿到i、她的作用域也沒取到i
當你在下面執行的時候、這一堆function都開始找自己作用域能取到的i、也就是循環執行完的10
var關鍵字宣告變數作用域為函數作用域, 因此 for 迴圈中的 i 變數會發生變數提升。 樓主的將for循環中的哪一段改為自執行函數就ok了。 eg:
function save_i(){
}