问题:
1:为啥会输出三个4
2:在chrome的console里面回车之后输出的 83,86,89是啥 会一直累加(ps:之前一开始好像数字很小,慢慢累加)
问题:
1:为啥会输出三个4
2:在chrome的console里面回车之后输出的 83,86,89是啥 会一直累加(ps:之前一开始好像数字很小,慢慢累加)
也许大概你的i是全局的,setTimeout(function(){..}),这里的function不是立即执行的。你这里的调用时间可能是在循环后再调用,循环完成后i为4
setTimeout是异步执行的,所以setTimeout无论时间设置多少,都会放到任务队列中等待执行,而for循环是同步执行的,在setTimeout之前,for循环已经完成,i变成了4
主程做了基本是到micro task再到marco task
setTimeout就是macro task
for循环将setTimeout将回调函数推进macro task
for循环结束了。执行macro task
此时i的值是引用
所以此时的i值应该为4
console.log()输出4遍
第二个问题
setTimeout执行之后会有一个计数器id
控制台默认返回值是上一条语句返回值。
上一条语句是你最后一个setTimeout
值是它的计数器id
那么此时就像你在控制台直接输出一个数字似的
跟js的执行机制有关,js是单线程的,同一时间只能做一件事,通过事件轮询实现异步的执行,直接调用函数变量之类同步执行会进入到执行栈中,按顺序执行,所有的异步执行,则会放入执行队列,在回调接到相应后,插入到执行栈中执行。
setTimeout是个异步执行的回调,在执行队列中,所以会等所有的for循环任务栈结束后再执行,设置的时间代表当回调执行时,等待多长时间后执行,而不是js解析器读到这段代码,等待多长时间执行,所以有时候还会感觉执行时间比给定的时间长。
返回值就像上面所说的是定时器编号,所以一般使用定时器,都会给予一个命名,方便以后清除定时器。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
setTimeout即使给的时间是0,回调也不会立马在for循环的过程中调用,都是推到任务队列去的,所以当回调正式执行的时候,i已经是4了,所以输出三个4
https://developer.mozilla.org...