settimeout方法执行时间的疑问

console.log("2");
setTimeout(function () {
    console.log("1");
}, 0)

控制台输出的结果:
2
xxx
1

这里xxx是一个随机的数,每次都不一样。为什么结果还有有这么一个随机数?

setTimeout(function () {
    console.log("1");
}, 0)
console.log("2");

然后这个输出的是:
2
undefined
1
为什么是先输出2?不是1呢?
另外,setTimeout会返回一个ID标识这个定时器,为什么第二段代码就没有返回这个ID?

阅读 4.6k
8 个回答

setTimeout的作用是将代码推迟到指定时间执行,如果指定时间为0,即setTimeout(f, 0),那么会立刻执行吗?

答案是不会。因为上一段说过,必须要等到当前脚本的同步任务和“任务队列”中已有的事件,全部处理完以后,才会执行setTimeout指定的任务。也就是说,setTimeout的真正作用是,在“消息队列”的现有消息的后面再添加一个消息,规定在指定时间执行某段代码。setTimeout添加的事件,会在下一次Event Loop执行。

setTimeout(f, 0)将第二个参数设为0,作用是让f在现有的任务(脚本的同步任务和“消息队列”指定的任务)一结束就立刻执行。也就是说,setTimeout(f, 0)的作用是,尽可能早地执行指定的任务。而并不是会立刻就执行这个任务。

转自阮一峰的js标准参考教程
http://javascript.ruanyifeng....

这里xxx是一个随机的数,每次都不一样。为什么结果还有有这么一个随机数?

xxxsetTimeout 函数调用的返回值。

为什么是先输出2?不是1呢?

因为 console.log('2')console.log('1') 先执行。

setTimeout是异步的

首先你需要理解event loop的概念
它是会先执行task 再执行setTimeout的
所以代码由上到下运行,然后先执行console
再执行setTimeout 将function压入marco task
setTimeout会返回一个计数器的id
你看到的所谓随机数应该是这个
task的console执行了 再执行micro task 再去执行marcotask
所以输出1
第二个同理

我试了一下,并没有随机数啊,至于

setTimeout(function () {
    console.log("1");
}, 0)

是因为JavaScript是单线程,这样会把这次任务添加到队列中,并不会同步执行,而是需要等完成当前任务之后才会去执行console.log(1),即使如下面这样:

setTimeout(function () {
    console.log("1");
}, 0)
console.log(4);
console.log(5);

console.log(1)也会在最后执行,不过我的并没有随机数呀

http://www.jianshu.com/p/9b4a... 可以看下这篇文章。每一个setTimeout在执行时,会返回一个唯一ID,用以传入clearTimeout,清除定时器。以及异步的执行顺序的问题。

setTimeout(function () {

console.log("1");

}, 0)
console.log("2");
程序是依次往下执行;但是当遇到定时器时;自动采取异步的方式;优先程序中的其他的执行完再执行定时器;所以2在前面;1在后面;undenfined的是匿名函数的没有返回值,默认是返回undefined.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题