一次围绕setTimeout的前端面试经验分享


Posted in Javascript onJune 15, 2017

前言

前端这个近年的热门领域,搞事气氛特别强烈,我朋友小伟最近就在疯狂面试,遇到了许多有趣的面试官,有趣的面试题,我来帮这个搞事 boy 转述一下。

具体如下:

以下是我一个朋友的故事,真的不是我。

for (var i = 0; i < 5; i++) {
 console.log(i);
}

“小伟,你说说这几行代码会输出什么?”

当面试官在 Sublime 打出这几行代码时,我竟有点蒙蔽。蛤?这不是最简单的一个循环吗?是不是有陷阱啊,我思索一下,这好像和我看的那个闭包的题很像啊,这面试官是不是没写完啊?有毒啊。

“应该是直接输出 0 到 4 吧...”,我弱弱的说到。

“是啊,别紧张,这题没啥陷阱,我就是随便写一下。”

(Excuse me?面试官你是来搞笑的吗,吓死老子了!)

“那你在看看这几行代码会输出什么?”

for (var i = 0; i < 5; i++) {
 setTimeout(function() {
 console.log(i);
 }, 1000 * i);
}

额,什么鬼,怎么还不是我背了那么多遍的那道闭包题,让我想想。 setTimeout 会延迟执行,那么执行到 console.log 的时候,其实 i 已经变成 5 了,对,就是这样,这么简单怎么可能难到老子。

“应该是开始输出一个 5,然后每隔一秒再输出一个 5,一共 5 个 5。”

“对,那应该怎么改才能输出 0 到 4 呢?”

终于到我熟悉的了,加个闭包就解决了,稳!

for (var i = 0; i < 5; i++) {
 (function(i) {
 setTimeout(function() {
  console.log(i);
 }, i * 1000);
 })(i);
}

“很好,那你能说一下,我删掉这个 i 会发生什么吗?”

for (var i = 0; i < 5; i++) {
 (function() {
 setTimeout(function() {
  console.log(i);
 }, i * 1000);
 })(i);
}

“这样子的话,内部其实没有对 i 保持引用,其实会变成输出 5。”

“很好,那我给你改一下,你看看会输出什么?”

for (var i = 0; i < 5; i++) {
 setTimeout((function(i) {
 console.log(i);
 })(i), i * 1000);
}

蛤?什么鬼,这是什么情况,让我想想。这里给 setTimeout 传递了一个立即执行函数。额,setTimeout 可以接受函数或者字符串作为参数,那么这里立即执行函数是个啥呢,应该是个 undefined ,也就是说等价于:

setTimeout(undefined, ...);

而立即执行函数会立即执行,那么应该是立马输出的。

“应该是立马输出 0 到 4 吧。”

“哎哟,不错哦,最后一题,你对 Promise 了解吧?”

“还可以吧...”

“OK,那你试试这道题。”

setTimeout(function() {
 console.log(1)
}, 0);
new Promise(function executor(resolve) {
 console.log(2);
 for( var i=0 ; i<10000 ; i++ ) {
 i == 9999 && resolve();
 }
 console.log(3);
}).then(function() {
 console.log(4);
});
console.log(5);

WTF!!!!我想静静!

这道题应该考察我 JavaScript 的运行机制的,让我理一下思路。

首先先碰到一个 setTimeout,于是会先设置一个定时,在定时结束后将传递这个函数放到任务队列里面,因此开始肯定不会输出 1 。

然后是一个 Promise,里面的函数是直接执行的,因此应该直接输出 2 3 。

然后,Promise 的 then 应当会放到当前 tick 的最后,但是还是在当前 tick 中。

因此,应当先输出 5,然后再输出 4 。

最后在到下一个 tick,就是 1 。

“2 3 5 4 1”

“好滴,等待下一轮面试吧。”

So easy!妈妈再也不用担心我的面试了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript 验证码的实例代码(附效果图)
Mar 22 Javascript
js相册效果代码(点击创建即可)
Apr 16 Javascript
jQuery 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
jQuery前端开发35个小技巧
May 24 Javascript
微信小程序中实现一对多发消息详解及实例代码
Feb 14 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
May 10 Javascript
vuejs父子组件之间数据交互详解
Aug 09 Javascript
vue.js项目打包上线的图文教程
Nov 16 Javascript
VUE基于NUXT的SSR 服务端渲染
Nov 30 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
Sep 25 Javascript
jQuery实现全选、反选和不选功能的方法详解
Dec 04 jQuery
利用JS对iframe父子(内外)页面进行操作的方法教程
Jun 15 #Javascript
使用Require.js封装原生js轮播图的实现代码
Jun 15 #Javascript
JavaScript实现选中文字提示新浪微博分享效果
Jun 15 #Javascript
详解vue跨组件通信的几种方法
Jun 15 #Javascript
Bootstrap响应式导航由768px变成992px的实现代码
Jun 15 #Javascript
javascript完美实现给定日期返回上月日期的方法
Jun 15 #Javascript
JS自动生成动态HTML验证码页面
Jun 14 #Javascript
You might like
php&amp;java(一)
2006/10/09 PHP
如何写php程序?
2006/12/08 PHP
PHP生成月历代码
2007/06/14 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
2019/05/06 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
python threading模块操作多线程介绍
2015/04/08 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Python中super函数用法实例分析
2019/03/18 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
python中time、datetime模块的使用
2020/12/14 Python
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
英语教师求职信
2014/06/16 职场文书
党委班子对照检查材料
2014/08/19 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
失职检讨书大全
2015/01/26 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
HTML+JS实现在线朗读器
2022/02/15 Javascript