[問題] 閉包

看板Web_Design作者 (雪姬)時間6年前 (2018/09/12 17:24), 6年前編輯推噓5(5011)
留言16則, 7人參與, 6年前最新討論串1/1
請問版上的大神們: for (var i = 0; i < 10; i++) { function test() { console.log(i); } test(); }  上面的程式跑下去,它會跑出 0,1,2,3... 但若是改成這樣就不會了: for (var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 0); }  想請問這是為什麼呢?  setTimeout是不會馬上執行是嗎? setTimeout跟其它的一般函式有什麼不一樣嗎? 另外我以為函式包在函式裡才是閉包 for(xxxxxx){} 這個for迴圈也是函式嗎? 新手入門,還請多多指點,感激感激~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.230.51.73 ※ 文章網址: https://www.ptt.cc/bbs/Web_Design/M.1536744248.A.0B0.html ※ 編輯: SheueJi (36.230.51.73), 09/12/2018 17:26:39

09/12 19:44, 6年前 , 1F
二個函數都是印出 i 的值,但 settimeout 是在一段時間後
09/12 19:44, 1F

09/12 19:45, 6年前 , 2F
才執行。執行時 i 的值已經是 10 了。
09/12 19:45, 2F

09/12 19:46, 6年前 , 3F
閉包是指函數宣告時會把外界的變數也包進來,會一層層往外
09/12 19:46, 3F

09/12 19:48, 6年前 , 4F
settimeout 具體來說是到所有 statement 都結束後才會開始
09/12 19:48, 4F

09/13 00:07, 6年前 , 5F
for(var i=0; i<10; i++){
09/13 00:07, 5F

09/13 00:09, 6年前 , 6F
function test(p){console.log(p);}(i)
09/13 00:09, 6F

09/13 00:09, 6年前 , 7F
}
09/13 00:09, 7F

09/13 00:10, 6年前 , 8F
把 i 傳給 test,test 用變數 p 去接收
09/13 00:10, 8F

09/13 00:11, 6年前 , 9F
這應該算callback問題
09/13 00:11, 9F

09/13 00:55, 6年前 , 10F
你需要了解的是同步、非同步的觀念
09/13 00:55, 10F

09/15 02:24, 6年前 , 11F
use let to replace var
09/15 02:24, 11F

09/15 14:20, 6年前 , 12F
這裡用 let 也是一樣的結果,除非你用 const
09/15 14:20, 12F

09/15 14:20, 6年前 , 13F
for (const i of [0..10])
09/15 14:20, 13F

09/15 14:21, 6年前 , 14F
喔抱歉 js 還沒有 [0..10] 這種用法
09/15 14:21, 14F

09/16 02:52, 6年前 , 15F
你可以把Number 的 iterator改掉,就可以 [...10] 了
09/16 02:52, 15F

09/16 02:53, 6年前 , 16F
當然正常人不會亂改這種東西
09/16 02:53, 16F
文章代碼(AID): #1RcDiu2m (Web_Design)
文章代碼(AID): #1RcDiu2m (Web_Design)