网站首页 > 技术文章 正文
前言
最近看到一道跟Javascript中的setTimeout和Promise有关的面试题,感觉很有趣。题目循序渐进,不断深入,虽然只是一道题目的简单变形,却考察了很多个知识点,今天我们就一起来看看这道题目吧。
Javascript
原始题目
我们就直接看题目的代码,首先是最简单的原始题目。
原始题目
上述的代码很简单,输出0,1,2,3,4。你可能会疑问,面试题会有这么简单?放心,好戏还在后头呢。
变形1
我们将上述的代码加上setTimeout,再进行输出,看看会输出什么?
变形1
上述代码每隔一秒会输出一个5。
这道题考察的是函数的闭包,如果不太清楚闭包知识的,可以去看看我写的这篇文章《前端面试中不可逃避的闭包问题,你真的了解吗?》。
变形2
那么如果我们想要每间隔一秒输出从0到4,该如何实现呢?
如果了解闭包知识的话,可以很容易想出通过立即执行函数解决。
变形2
通过上述的代码,就可以很容易达到我们的要求。
变形3
那么我们继续对题目做变形,我们去掉这个立即执行函数中的i参数,看看结果会输出什么?
变形3
通过在控制台中运行,我们发现结果和变形1一样,间隔一秒输出一个5,那么为什么会这样呢?
这是因为在立即函数内部并没有对i的引用,实际的i仍然为外部作用域中的i,所以结果会和变形1相同。
变形4
我们继续对这道题目做出变形,将setTimeout中函数改为一个立即执行函数,看看结果会是什么?
变形4
通过在控制台运行上述代码,得到的结果是立即输出0, 1, 2, 3, 4。为什么会这样呢?
根据setTimeout的用法,它接收的参数为函数或者函数的字符串表示,如果给setTimeout传递一个立即执行函数,则相当于传递了一个undefined,实际上是往定时器线程中添加了5个undefined。但是由于立即执行函数的存在,这个函数会立即执行,所以会立即输出0, 1, 2, ,3 ,4。
变形5
如果以上的部分你都能知道,那么我们再来个更难一点的变形,将setTimeout配合Promise一起使用,看看以下的一段代码会输出什么?
变形5
通过在控制台运行以上代码,我们得到结果是立即输出2, 3, 5, 4, 1,这是为什么呢?
首先在代码的开头,使用了setTimeout设置了一个定时器,虽然这个定时器的时间为0,但是根据Javascript中的事件队列机制,会将这个定时器添加到专属的定时器线程中,等到当前线程中的事件回调执行完后才能执行。不太懂Javascript的setTimeout机制的,可以去看看我写的这篇文章《Javascript中的setTimeout黑魔法》。
然后是定义一个Promise,这个Promise会在setTimeout之前执行。在Promise中执行了两个console.log(),所以会先输出2,3。
在Promise中有一个for循环,当循环执行到i等于9999时,执行resolve回调函数,这个resolve函数就是后面输出4的函数。但是由于Promise.then()的回调会在当前事件队列的最后执行,因此4会在5的后面输出。
在当前事件队列执行完后,才会执行setTimeout中的函数,因此1是最后输出的。
因此输出结果是2, 3, 5, 4, 1。
结束语
由一道最简单的题可以通过变形衍生出很多知识点的考题,看看你都会做吗?
猜你喜欢
- 2025-06-24 晨光微醺时!2 道 JS 核心题漫谈,解锁面试小技巧
- 2025-06-24 js基础面试题92-130道题目(50道js面试题)
- 2025-06-24 3 个高级 JavaScript 面试问题(js面试题必问)
- 2025-06-24 晨光微暖时!2 道 JS 经典面试题拆解,开启惬意学习日
- 2025-06-24 JS面试题突破:谈谈 undefined 和 null ?
- 2025-06-24 9 个你可能不知道答案的常见 JavaScript 面试题
- 2025-06-24 19个基本的JavaScript面试问题及答案(都是实用技巧)免费送
- 2025-06-24 JavaScript篇面试题(js面试题基础)
- 2024-10-05 前端面试,你有必要知道的一些JavaScript 面试题(上)
- 2024-10-05 几道看起来代码量很少的Javascript笔试题,看看你会不会做?
你 发表评论:
欢迎- 586℃几个Oracle空值处理函数 oracle处理null值的函数
- 580℃Oracle分析函数之Lag和Lead()使用
- 568℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 564℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 561℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 553℃【数据统计分析】详解Oracle分组函数之CUBE
- 539℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 533℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)