看板 Web_Design 關於我們 聯絡資訊
請問版上的大神們: 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
gholk: 二個函數都是印出 i 的值,但 settimeout 是在一段時間後 09/12 19:44
gholk: 才執行。執行時 i 的值已經是 10 了。 09/12 19:45
gholk: 閉包是指函數宣告時會把外界的變數也包進來,會一層層往外 09/12 19:46
gholk: settimeout 具體來說是到所有 statement 都結束後才會開始 09/12 19:48
shter: for(var i=0; i<10; i++){ 09/13 00:07
shter: function test(p){console.log(p);}(i) 09/13 00:09
shter: } 09/13 00:09
shter: 把 i 傳給 test,test 用變數 p 去接收 09/13 00:10
x246libra: 這應該算callback問題 09/13 00:11
mirtac: 你需要了解的是同步、非同步的觀念 09/13 00:55
Rplus: use let to replace var 09/15 02:24
Gold740716: 這裡用 let 也是一樣的結果,除非你用 const 09/15 14:20
Gold740716: for (const i of [0..10]) 09/15 14:20
Gold740716: 喔抱歉 js 還沒有 [0..10] 這種用法 09/15 14:21
mmis1000: 你可以把Number 的 iterator改掉,就可以 [...10] 了 09/16 02:52
mmis1000: 當然正常人不會亂改這種東西 09/16 02:53