[问题] 闭包

楼主: 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