这道JS面试题只有29%的人能答对,你是其中之一吗?(附事件循环面试题答案解析)...

491ac226767ed67116034aec74dbde03.jpeg

事实是,即使你不精通JavaScript,也能通过任何JavaScript面试。如果你是JavaScript开发者,并且经常进行面试,那么你知道这些面试中的问题总是相似的(或多或少吧)。在不同的公司进行面试时,面试官会考察你有关相同主题的知识。尽管如此,正如你将看到的那样,正确回答此类问题的统计数据相当低。

如何改变这种情况?轻而易举——尽可能多地练习这些主题,最重要的是要理解结果。本篇文章是本系列的第二篇,废话不多说,大家请看题。

第二题、 关于JS的执行上下文(Context)

上下文问题可能会让你困扰,即使是经验丰富的开发人员。例如,只有29%的开发人员解决了这个棘手但本质上简单的任务。在这道面试题里,我们考察了关于JS上下文执行的理解。

国外社区的网友只有 29% 的人答对了

下面我们来挑战下这道题,题目如下:

'use strict';

function foo() {
  console.log(this);
}

function callFoo(fn) {
  fn();
}

let obj = { foo };

callFoo(obj.foo);

这道题主要考察面试者对于JavaScript中执行上下文的理解,特别是在函数调用时的this关键字指向。此外,也可以考察面试者对于ES6中新特性的掌握程度,例如对象的解构赋值。通过这个问题,面试官可以了解面试者对于JavaScript语言的掌握情况,以及面试者是否能够理解和解决在函数调用时this指向的问题。

现在你有充足的时间思考这道题的答案,请选择你认为正确的答案,看看是不是其他人的答案是否和你一样,以及统计结束时,我们的正确率是不是能超过外国网友 29% 的正确率,我头条粉丝的正确率是 24.6% 。

目前由于这个投票功能限制,暂时不能告诉你正确答案,为了给你充足的思考和作答时间,本篇文章暂不公布答案和解析,我会在下一篇文章里进行公布,为了方便你能及时收到我下一篇文章的推送,请关注「前端达人」。

如果你是个急性子,想知道答案,可以私信我“执行上下文面试题”获取答案。

上一题答案及解析:事件循环

setTimeout(() => console.log(1), 0);

console.log(2);

new Promise(res => {
  console.log(3)
  res();
}).then(() => console.log(4));

console.log(5);

共有83位热心的粉丝参与了这道题。感谢各位积极参与。这道题的正确答案是:2,3,5,4,1。你答对了吗?

这次统计总共有 39 位粉丝答对了这个问题,正确率 46%,大大超出外国网友 18% 的正确率。如下图所示:

cf9f9487d145950b5fe5d49b607e888a.jpeg

关于这道题的解释:

现在我们来模拟一个回答正确的面试者的思考过程:

  • 给定零延迟,我们传递给setTimeout的函数会同步执行还是异步执行?

  •  尽管setTimeout函数延迟时间为零,但回调函数是异步调用的。引擎将把回调函数放置在回调队列(宏任务队列)中,在空闲时将其移动到调用栈中。因此,数字1将被跳过,数字2将首先显示在控制台中。

  • 我们传递给Promise构造函数的函数会同步执行还是异步执行?

  • Promise构造函数接收的函数会同步执行。因此,控制台中下一个要显示的数字是3。

  • 给定零延迟,我们传递给Promise的then方法的函数会同步执行还是异步执行?

  • 即使Promise在没有延迟的情况下解决,then方法中的回调也是异步执行的。与setTimeout的区别在于,引擎将Promise回调放入另一个队列中,即作业队列(微任务队列),在那里它将等待执行的机会。因此,进入控制台的下一个数字是5。

  • 哪个具有更高的优先级-微任务队列还是宏任务队列,或者换句话说- Promise还是setTimeout?

  • 微任务(Promise)比宏任务(setTimeout)具有更高的优先级,因此控制台中下一个数字将是4,最后是1。

分析回答,我们可以得出结论,大多数受访者错误地认为作为Promise构造函数参数传递的执行函数是异步调用的。

结束

今天的分享就到这里,感谢你的阅读,希望能够帮助到你,文章创作不易,如果你喜欢我的分享,别忘了点赞转发,让更多有需要的人看到,最后别忘记关注「前端达人」,你的支持将是我分享最大的动力,后续我会持续输出更多内容,敬请期待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值