首页 > 试题广场 >

执行以下代码,输出结果为()

[单选题]
执行以下代码,输出结果为()
console.log(1);
let a = setTimeout(() => {console.log(2)}, 0);
console.log(3);
Promise.resolve(4).then(b => {
    console.log(b);
    clearTimeout(a);
});
console.log(5);
  • 1
    2
    3
    4
    5
  • 1
    3
    4
    5
  • 1
    3
    5
    4
  • 1
    3
    5
    4
    2
console.log(1);
let a = setTimeout(() => {console.log(2)}, 0);
console.log(3);
Promise.resolve(4).then(b => {
console.log(b);
clearTimeout(a);
});
console.log(5);
答案基本才C,D中产生,我选的D。
执行顺序是先执行同步的任务--输出1,3,5
在执行异步任务:其中异步任务分为宏任务和微任务,微任务优先级高于宏任务。promise.then执行的微任务,输出4,然后clearTimeout(a)清除了定时器,于是不再打印2。
结果输出:1,3,5,4
发表于 2019-08-25 14:33:20 回复(7)
promise 是微任务,会在当前轮事件循环结束前执行;
setTimeout 是宏任务,在下一轮事件循环执行;
所以这个 setTimeout 设置的定时器被取消掉了。
发表于 2019-08-16 15:46:27 回复(1)

同步→异步→回调

promise是异步微任务,

setTimeout是异步宏任务,

微任务比宏任务先执行,所以取消了定时器回调

发表于 2019-09-23 10:58:48 回复(0)
console.log(1);//同步
let a = setTimeout(() => {console.log(2)}, 0);//回调
console.log(3);//同步

Promise.resolve(4).then(b => {
console.log(b);//异步
clearTimeout(a);
});
console.log(5);//同步
执行顺序:同步=》异步=》回调
先执行同步代码 输出1,3,5
在执行异步代码 输出 4
取消了定时器事件 于是不输出2
发表于 2019-09-03 14:27:29 回复(0)
先执行同步任务(输出1,3,5),然后再执行异步任务(微任务和宏任务),所以先执行微任务(promise)输出4,在执行宏任务(setTimeout),刚好在执行promise的时候将定时器取消了,所以2没有被输出,所以答案就是1,3,5,4;
发表于 2020-12-02 15:41:05 回复(0)
console.log(1);
let a = setTimeout(() => {console.log(2)}, 0);
console.log(3);
Promise.resolve(4).then(b => {
    console.log(b);
    clearTimeout(a);
});
console.log(5);
 
 
//先把同步的执行完,得:1,3,5

//还剩一个微任务(.then)和一个宏任务(setTimeout),
//先执行微任务,再执行宏任务

//在微任务里得4, 然后clearTimeout(a)清除定时器,不再执行定时器
//所以结果是 1,3,5,4

发表于 2022-01-18 15:39:49 回复(0)
promise 是微任务,会在当前轮事件循环结束前执行; setTimeout 是宏任务,在下一轮事件循环执行; 所以这个 setTimeout 设置的定时器被取消掉了。
发表于 2019-09-03 08:29:23 回复(0)
感觉这个题考的是JavaScript的异步加载,有同步和异步加载的情况下,优先因此先是console. log(1) 后面console. log(2)因为是异步加载的会放到后面同步加载完加载 console. log(3) 然后同步console. log(5) 同时promise的用法 是用来解决es5异步加载循环调用的问题,在promise里面清除了 setinterval这个全局对象,因此就不能显示。console. log(4)
编辑于 2019-08-16 07:50:42 回复(0)
事件循环机制,因为js是单线程语言,所以会一行行执行,然后是先执行同步代码,然后就是微任务(promise.then,process.nextTick这两个都是微任务,但是process.nextTick这个的优先级是要高于promise.then的)然后是宏任务执行,就是定时器这些。
编辑于 2022-11-07 23:48:14 回复(0)
4为宏任务,2为微任务,先执行4,在执行了打印4之后,清除了定时器,2不会打印
发表于 2021-06-19 16:54:25 回复(1)
①执行顺序是先执行同步的任务--输出1,3,5 ②在执行异步任务:其中异步任务分为宏任务和微任务,微任务优先级高于宏任务。 promise 是微任务,会在当前轮事件循环结束前执行; setTimeout 是宏任务,在下一轮事件循环执行; 所以这个 setTimeout 设置的定时器被取消掉了。 ③同步→异步→回调
编辑于 2021-03-19 11:56:20 回复(0)
主要注意一点异步任务中的宏任务和微任务,微任务执行顺序早于宏任务,promise属于微任务
发表于 2020-11-15 22:38:17 回复(0)
执行顺序:主线程-》微任务-》宏任务
常见的宏任务:setInterval,setTimeout,Ajax,Dom事件
常见的微任务:Promise,Async/await
宏任务是由宿主发起的:浏览器,Node
微任务室友JS自身发起的
发表于 2023-04-30 20:35:24 回复(0)

注意:new Promise在实例化的过程中所执行的代码都是同步进行的,而then中注册的回调才是异步执行的。
async/await底层是基于Promise封装的,所以await前面的代码相当于new Promise,是同步进行的,await后面的代码相当于then,才是异步进行的。

发表于 2022-09-15 00:37:29 回复(0)
哈哈哈哈  超自信的选了D  根本没看到人家清楚了定时器  哈哈哈哈哈!!!
发表于 2022-09-06 17:42:14 回复(0)
微任务队列执行时机为当前宏任务快要完成的时后
编辑于 2022-05-20 23:25:34 回复(0)
Promise微任务,setTimeout宏任务,微任务先执行,把定时器清除掉,2就不执行了
发表于 2022-01-15 13:36:49 回复(0)
JS执行顺序:同步>异步>回调
发表于 2021-11-07 16:33:02 回复(0)
没有注意到promise函数里面的clearTimeout 🙄
发表于 2021-10-19 11:22:39 回复(0)
事件执行机制
发表于 2021-08-08 07:58:35 回复(0)