一次围绕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 相关文章推荐
一个网马的tips实现分析
Nov 28 Javascript
js检查页面上有无重复id的实现代码
Jul 17 Javascript
Jquery插件分享之气泡形提示控件grumble.js
May 20 Javascript
jquery实现可拖拽弹出层特效
Jan 04 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
jquery+html5烂漫爱心表白动画代码分享
Aug 24 Javascript
js倒计时简单实现代码
Aug 11 Javascript
javascript内存分配原理实例分析
Apr 10 Javascript
vue 配置多页面应用的示例代码
Oct 22 Javascript
JavaScript栈和队列相关操作与实现方法详解
Dec 07 Javascript
js实现移动端轮播图
Dec 21 Javascript
在Vue 中实现循环渲染多个相同echarts图表
Jul 20 Javascript
利用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全排列递归算法代码
2012/10/09 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
php常用表单验证类用法实例
2015/06/18 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
Python中的fileinput模块的简单实用示例
2015/07/09 Python
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
旅游管理实习自我鉴定
2013/09/29 职场文书
高中生学习生活的自我评价
2013/11/27 职场文书
买房委托公证书
2014/04/08 职场文书
工作收入证明模板
2014/10/10 职场文书
幼儿学前班评语
2014/12/29 职场文书
母亲节主题班会
2015/08/14 职场文书
《火烧云》教学反思
2016/02/23 职场文书