一道容易栽坑的有趣的面试题(关于js,定时器,闭包等)

1.首先下面代码输出什么?

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

输出:0 1 2 3 4

2.上面只是普通的输出,没有陷阱再看下面这个题(套路开始了)

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

输出:5 5 5 5 5

setTimeout 会延迟执行,那么执行到 console.log 的时候,其实 i 已经变成 5 了,因此会输出5个5

3.上面的题超出我们的预想,我们肯定想得到的是0 1 2 3 4,那么问题来了 怎么才能输出0 1 2 3 4呢

1 for (var i = 0; i < 5; i++) {
2   (function(i) {
3     setTimeout(function() {
4       console.log(i);
5     }, i * 1000);
6   })(i);
7 }

或者:

1 for(var i = 0; i < 5; i++) {
2     setTimeout(function(i) {
3         return function() {
4             console.log(i);
5         };
6     }(i), i * 1000);
7 }

输出:0 1 2 3 4

加上闭包,就能解决这个问题

4.如第一个假设删除了function(i)中的i呢,怎么办?

1 for (var i = 0; i < 5; i++) {
2   (function() {
3     setTimeout(function() {
4       console.log(i);
5     }, i * 1000);
6   })(i);
7 }

输出:5 5 5 5 5

内部其实没有对 i 保持引用,其实会变成输出 5个5

5.再更改一下

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

输出:0 1 2 3 4 (立刻输出,没有时间间隔)

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

setTimeout(undefined, ...);

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

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

6.对于promise的考察

 1 setTimeout(function() {
 2   console.log(1)
 3 }, 0);
 4 new Promise(function executor(resolve) {
 5   console.log(2);
 6   for( var i=0 ; i<10000 ; i++ ) {
 7     i == 9999 && resolve();
 8   }
 9   console.log(3);
10 }).then(function() {
11   console.log(4);
12 });
13 console.log(5);

输出:2 3 5 4 1

考察 JavaScript 的运行机制的,

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

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

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

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

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

所以输出:2 3 5 4 1

时间: 2024-10-12 14:36:08

一道容易栽坑的有趣的面试题(关于js,定时器,闭包等)的相关文章

一些JAVA中有趣的面试题

这几天的JAVA培训课上,不断的唤醒自己对JAVA的理解(时间太长,大学学的快忘干净了),其中有一些很有趣的面试题,都是在抠JAVA细节(唉,我是那种见坑就往下跳的人,一做就错),下面就来分享一下: 1)用JAVA程序写出当你在超市购物花费1.1元时,你给收银员2元钱,收银员找你0.9元的过程: 当时一看题目,好简单啊!迅速写出: public class Sell{ public static void main(String[] args){ double total = 2.0; doub

一道有趣的面试题

一道面试题.接受参数n=5,不用for循环输出数组[1,2,3,4,5] 这用递归的思路,配合arguments.callee,代码如下 1 function show(n) { 2 var arr = []; 3 return (function () { 4 arr.unshift(n); 5 n--; 6 if (n != 0) { 7 arguments.callee(); 8 } 9 return arr; 10 })() 11 } 12 show(5)//[1,2,3,4,5] 现在

java抽象-老师的生日-逻辑思维-有趣的面试题-遁地龙卷风

(-1)写在前面 都快去北京了,硬生生的安排一场java考试,对于那些特别细节的东西我忘了吧也不觉得有什么不好,以前都记得,也都见过,只不过平时不常用连接断了,但是你死记硬背是没用的,一段时间后还是会忘,唯一的途径就是多做东西,理论联系实际,相反这道题我感觉很有意思,也在网上看到了很多解释,觉得都有所不足,下面是我给出的答案. (0)详细解释 设一个老师的生日为M月N日.把M告诉学生甲(即学生甲知道老师出生的月份),把N告诉学生乙(即学生乙知道老师出生的日).现有如下日期是公开的:3月4日,3月

有趣的笔试题

1.假如你有一块金条,要一个人为你工作七天,你可以将金条割两次,并且每天付一次工钱,这时你该怎么割这金条才能每天都发工资给这个工人?1/7 2/7 4/7各为一块就可以了第一天给1/7第二天给2/7,拿回 1/7第三天给1/7第四天给4/7,拿回1/7和2/7第五天给1/7第六天给2/7,拿回 1/7第七天全给了 2. 镜子里的时间什么时候与真实的时间一样?(分两种1.电子时钟2.钟表) 时间是在什么上面显示如果在钟里,就是12点和6点如果是电子显示,那就00:00:00,11:11:11 3.

有趣的面试题

4G内存的电脑,如何读取8G的日志文件进行分析,汇总数据成报表. 先说思想解决,不说实际代码实现: 1. 内存1G,所以大文件首先要分割:如分割为20个文件,那么每个可以做到接近250M左右 2. 拿前面的3个文件做案例: A B C  3个文件,每个250M:首先做到加载没有问题 1.A 文件读取到SetA中,此时集合中A的URL不重复 2.B文件读取到SetB中: 3.SetA 和SetB比较,将集合A和B中相同项都剔除: 4.清空SetB: 5.加载C文件:SetA 和SetC比较,将集合

js 面试的坑

判断页面滚动方向(上下) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> body{ height:1000px; } </style> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"

为C# as 类型转换及Assembly.LoadFrom埋坑!

背景: 不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有) 效果是这样的: 之后,有小部分用户反映,工具用不了(没反应或有异常)~~~ 然后,建议小部分用户换个电脑环境试试,有些就好了~~~ 于是,我假定是VS环境下的 Microsoft.VisualStudio.DebuggerVisualizers.dll 的版本不一致引发的. 因此,一般我都建议用户自己下载源码,重新引用去编绎一下!!! 由于该工具一直在CSDN论坛的VB.NET版块置顶着. 考虑到受众

一道面试题

背景介绍 这里给大家分享一道很有趣的面试题. 面试过程 面试官:redis我看你有使用过,说一下redis的基本类型吧? A:String,Hash,Set,List,Zset. 面试官:redis中string类型的实现有没有了解过? A:(喵喵喵?) 面试官:回家等通知吧. 面试反思 作为一个爱学习的好孩子,遇到不会的当然要努力学习了,于是查阅了良多资料,算是把这个问题给搞明白了,下面且听我慢慢道来~ Redis的底层数据结构 经过查阅资料,发现Redis的底层数据结构分为八种 Long类型

那些有趣的Webview细节

最近公司的项目"一步"上用到了webview与js交互,主要是用google地图必须要安装有google pay,但是国内的手机都去掉了, 没办法只有用google地图的网页版了, 好在公司ios的小伙伴会h5,英语也不赖, 所以我倒是没爬google的坑,专心搞下webview与js交互的问题了. 第一个问题:地图加载不出来 webview调用的本地js接口不一定是在主线程,我估计和html写的有关(异步), 所以如果是要在本地的接口中更新ui或者有些网络框架要在主线程中做的话请用h