首页 > 试题广场 >

请问以下JS代码的输出顺序是? let date = new

[单选题]
请问以下JS代码的输出顺序是?
let date = new Date()
setTimeout(() => {
    console.log('1')
}, 2000)
setTimeout('console.log(2)',1000);
setTimeout(function() {
  console.log('3')
}, 1500);
while((new Date() - date) < 3000) {}


  • 报错
  • 3秒以后同时输出2 3 1
  • 1秒后输出2,1.5秒后输出3,2秒后输出1
  • 4秒后输出2,4.5秒后输出3,5秒后输出1
let date = new Date()
setTimeout(() => {
    console.log('1')
}, 2000)
setTimeout('console.log(2)',1000);
setTimeout(function() {
  console.log('3')
}, 1500);
while((new Date() - date) < 3000) {}
在执行前八行代码的时候在回调函数队列里面依次添加三个回调函数,此时回调函数队列为【2,3,1】
然后在while循环里面停留三秒,这时已经把回调函数队列里面的三个回调函数的等待时间都花光了,等循环停留三秒结束后,立刻执行回调函数队列里面的函数,所以3秒以后同时输出2 3 1。
发表于 2021-12-14 11:03:30 回复(13)
while哪里是微任务?while就是同步执行的吧。我还在最后加了一行console试了一下,console并没有马上执行,也是过了三秒等while结束了才打印。
发表于 2022-08-20 18:29:22 回复(2)
evenLoop,当遇到setTimeout或者SetInterval  ,他们会进入宏任务队列,此时,函数不执行,但是他们的时间会开始计算。如果程序微任务或者代码运行时间过长,那么执行宏任务时他们会直接执行
发表于 2022-04-26 15:27:59 回复(0)
while是微任务
发表于 2022-04-06 12:41:03 回复(1)
三个setTimeout 是异步 进入异步队列(并进行读秒)  while 是同步  只有当同步代码执行完毕才会执行异步代码  当while 同步执行完毕时 已经过了三秒 而且三个setTimeout 时间都已经过了 所以会同时打印出来


编辑于 2023-05-09 00:24:13 回复(0)
let date = new Date() //①
    //②
    setTimeout(() => {
      console.log('1')
    }, 2000)
    //③
    setTimeout('console.log(2)', 1000);
    //④
    setTimeout(function () {
      console.log('3')
    }, 1500);
    while ((new Date() - date) < 3000) { }//⑤
    // ①⑤属于同步任务,②③④属于宏任务。从①开始执行,执行到②时,会先将他挂起,然后等2s后
    //放入队列,执行到③时,挂起然后等1s放入队列,执行到④,挂起等1.5s放入队列。
    // new Date()-date其实是对new Date()、date进行隐式转换成时间戳进行相减。
    //执行⑤时,等待3s后(在等待1s后,③到时间了,优先放入队列。等待1.5s后,④到时间了,放入队列,等待2s后,②放入队列)
    //执行栈从队列取出宏任务执行。分别输出2、3、1

发表于 2022-09-29 10:32:15 回复(0)
就是报错啊,
Callback must be a function.

发表于 2022-01-04 10:57:18 回复(10)
setTimeOut中的字符串会被当做代码执行(IE有安全策略,可在火狐或者vscode中尝试),While是同步,等待三秒后同步任务执行完毕,三个定时器是宏任务,等待对应时间后会推入任务队列,当执行栈中同步任务执行完毕,依次从队列中推出打印任务执行 输出231
发表于 2023-04-08 16:04:48 回复(0)
let date = new Date()
setTimeout(() => {
  console.log('1')
}, 2000)
setTimeout(() => {
  console.log(2)
}, 1000)
setTimeout(function () {
  console.log('3')
}, 1500)
while (new Date() - date < 3000) {
  console.log(new Date() - date)
}
//这段代码用VS跑,效果很明显
发表于 2023-03-10 10:47:58 回复(0)
  • while是微任务。
  • evenLoop,当遇到setTimeout或者SetInterval  ,他们会进入宏任务队列,此时,函数不执行,但是他们的时间会开始计算。如果程序微任务或者代码运行时间过长,那么执行宏任务时他们会直接执行
编辑于 2022-07-18 10:37:49 回复(0)
发表于 2022-03-31 15:12:11 回复(1)

执行后报错了 


发表于 2022-11-09 17:18:56 回复(1)
setTimeout可以将字符串当成代码执行,因此不会报错。逐行解析:

let date = new Date()
setTimeout(() => {
    console.log('1')
}, 2000); //将打印1的栈丢给定时器,等待2s后插入宏任务队列,等待事件循环从宏任务队列中取出并执行。
setTimeout('console.log(2)',1000); //将打印2的栈丢给定时器,等待1s后插入宏任务队列,等待事件循环执行。
setTimeout(function() {
  console.log('3')
}, 1500);//将打印3的栈丢给定时器,等待1.5s后插入宏任务队列,等待事件循环执行。
while((new Date() - date) < 3000) {} // 3s内执行{}的内容,宏任务执行完毕,然后清空微任务队列(我的理解是这里没有微任务,不明白为什么说while所在是微任务,)
1s后打印2的函数由事件循环入栈,1.5s后打印3的函数入栈,2s后打印1的函数入栈。
发表于 2022-09-03 12:19:38 回复(0)
setTimeout('console.log(1)',1000),这样写错了吧
发表于 2022-09-03 03:39:47 回复(0)
我觉得定时器不能把字符串转函数,有没有起码的
发表于 2022-08-10 17:31:33 回复(0)