作者SheueJi (雪姬)
看板Web_Design
標題[問題] 閉包
時間Wed Sep 12 17:24:04 2018
請問版上的大神們:
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://webptt.com/m.aspx?n=bbs/Web_Design/M.1536744248.A.0B0.html
※ 編輯: SheueJi (36.230.51.73), 09/12/2018 17:26:39
1F:推 gholk: 二個函數都是印出 i 的值,但 settimeout 是在一段時間後 09/12 19:44
2F:→ gholk: 才執行。執行時 i 的值已經是 10 了。 09/12 19:45
3F:→ gholk: 閉包是指函數宣告時會把外界的變數也包進來,會一層層往外 09/12 19:46
4F:→ gholk: settimeout 具體來說是到所有 statement 都結束後才會開始 09/12 19:48
5F:推 shter: for(var i=0; i<10; i++){ 09/13 00:07
6F:→ shter: function test(p){console.log(p);}(i) 09/13 00:09
7F:→ shter: } 09/13 00:09
8F:→ shter: 把 i 傳給 test,test 用變數 p 去接收 09/13 00:10
9F:推 x246libra: 這應該算callback問題 09/13 00:11
10F:→ mirtac: 你需要了解的是同步、非同步的觀念 09/13 00:55
11F:→ Rplus: use let to replace var 09/15 02:24
12F:推 Gold740716: 這裡用 let 也是一樣的結果,除非你用 const 09/15 14:20
13F:→ Gold740716: for (const i of [0..10]) 09/15 14:20
14F:→ Gold740716: 喔抱歉 js 還沒有 [0..10] 這種用法 09/15 14:21
15F:推 mmis1000: 你可以把Number 的 iterator改掉,就可以 [...10] 了 09/16 02:52
16F:→ mmis1000: 當然正常人不會亂改這種東西 09/16 02:53