为了账号安全,请及时绑定邮箱和手机立即绑定

如何理解这样的一道题?(不要测试,留下你的分析过程与结果)

如何理解这样的一道题?(不要测试,留下你的分析过程与结果)

浮云间 2019-03-13 17:15:49
如题详述: 刚面试完,就来写下了这样一道题目,还没有测试,也希望你不要测试,留下您的分析过程与答案1、一切都是由我写的一道使用reduce方法求和数组引起的:var arr = [1,2,3];arr.reduce((sum,value) => {    return sum + value},0)2、但是被面试官在上面加了点东西,就有点懵逼了:var arr = [1,2,3];arr.reduce((sum,value) => {    setTimeout(() => console.log(1), 0)    return sum + value},0)我说,先输出求和结果,再输出1(个人理解不知道对错,他也没说多少。)3、接着,他又在上面修改了,想了下还是保留我的答案var arr = [1,2,3];arr.reduce((sum,value) => {    setTimeout(() => console.log(1), 1000)    return sum + value},0)请问你们是怎样分析与理解的....
查看完整描述

6 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

第一个是6,没什么说的。
第二个是先6,立刻后3个1。
第三个是先6,一秒后3个1。
面试官是想考js的eventloop,简单的说就是事件的优先级。具体叫哪个名词记不清楚了,setTimeout的优先级没有顺序执行的代码优先级高。拿第二个来说,reduce第一次的时候,遇到了settimeout,把settimeout放到次优先级的队列里,然后第二次,第三次。当reduce都执行完毕,开始执行次优先级队列的任务。第三个就更清楚了,执行次优先级队列之前先等一秒。

查看完整回答
反对 回复 2019-04-10
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

个人理解:


arr.reduce 传第二个参数,所以会执行arr.length 次, 也就是会执行 arr.length次setTimeout, 此题如下:


const eventLoop = [];

const arr = [1,2,3]

arr.reduce((sum, value) => {

    eventLoop.push(() => console.log(1));

    return sum + value;

});


eventLoop.forEach(fn => fn())

不管时间多少,一直在reduce的线程中,所以都是输出求和结果,在执行setTimeout的回调


可能不对,哈哈哈


查看完整回答
反对 回复 2019-04-10
?
千巷猫影

TA贡献1829条经验 获得超7个赞

其实大概是考你执行顺序吧!不过已经有大佬进行发言了,具体我就不太清楚了。如果没有看到大佬说的优先级,我会依据个人经验推论,既然他显示结果,那么必然是返回后再执行的,但如果它设了 setTimeout 事件,那么第二个,没有延迟,会直接进行执行。而第三个因为有延迟,会出现执行完后,在第一次运行的延迟时间到了连续出现一的结果。

验证后,大佬说的优先级是没错的。


查看完整回答
反对 回复 2019-04-10
?
PIPIONE

TA贡献1829条经验 获得超9个赞

这需要分析啥?

很简单吧?

  1. 你会

  2. 就是setTimeout执行三次,因此稍后会输出三个1

  3. 还是setTimeout执行三次,因此稍后会输出三个1, 但是时间在1000ms之后


查看完整回答
反对 回复 2019-04-10
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

第一个输出6
第二个是先输出6,然后输出1,1,1
第三个是先输出6,一秒后,再输出1,1,1

这‘三个1’是有顺序的,哪怕时间间隔很小(可能1ms都不到),但还是有顺序的


查看完整回答
反对 回复 2019-04-10
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

这是关于时间循环的考察,你的代码会在执行栈中执行,setTimeout会被放入任务队列中。执行的时候是要先运行执行栈中的代码,再将任务队列中的代码放到执行栈中执行。所以setTimeout会在之后输出。


查看完整回答
反对 回复 2019-04-10
  • 6 回答
  • 0 关注
  • 529 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信