一次围绕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 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
Sep 15 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
Oct 11 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
JavaScript实现的encode64加密算法实例分析
Apr 15 Javascript
JavaScript代码性能优化总结篇
May 15 Javascript
JavaScript中的操作符类型转换示例总结
May 30 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
Dec 18 Javascript
Django+Vue跨域环境配置详解
Jul 06 Javascript
简述vue路由打开一个新的窗口的方法
Nov 29 Javascript
详解如何快速配置webpack多入口脚手架
Dec 28 Javascript
javascript实现倒计时关闭广告
Feb 09 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代码
2008/09/10 PHP
PHP的博客ping服务代码
2012/02/04 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
理解javascript对象继承
2016/04/17 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
python实现飞行棋游戏
2020/02/05 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
留学推荐信写作指南
2014/01/25 职场文书
水果超市创业计划书
2014/01/27 职场文书
2014年教师节寄语
2014/08/11 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
试用期自我评价范文
2015/03/10 职场文书
培根随笔读书笔记
2015/07/01 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android