[問題] 閉包

作者: SheueJi (雪姬)   2018-09-12 17:24:04
請問版上的大神們:
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迴圈也是函式嗎?
新手入門,還請多多指點,感激感激~~
作者: gholk (正常正高)   2018-09-12 19:44:00
二個函數都是印出 i 的值,但 settimeout 是在一段時間後才執行。執行時 i 的值已經是 10 了。閉包是指函數宣告時會把外界的變數也包進來,會一層層往外settimeout 具體來說是到所有 statement 都結束後才會開始
作者: shter (飛梭之影)   2018-09-13 00:07:00
for(var i=0; i<10; i++){function test(p){console.log(p);}(i)}把 i 傳給 test,test 用變數 p 去接收
作者: x246libra (楓)   2018-09-13 00:11:00
這應該算callback問題
作者: mirtac (mirtac)   2018-09-13 00:55:00
你需要了解的是同步、非同步的觀念
作者: Rplus (R+) (9527)   2018-09-15 02:24:00
use let to replace var
作者: Gold740716 (項為之強)   2018-09-15 14:20:00
這裡用 let 也是一樣的結果,除非你用 constfor (const i of [0..10])喔抱歉 js 還沒有 [0..10] 這種用法
作者: mmis1000 (秋月戀楓)   2018-09-16 02:52:00
你可以把Number 的 iterator改掉,就可以 [...10] 了當然正常人不會亂改這種東西

Links booklink

Contact Us: admin [ a t ] ucptt.com