作者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/cn.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