老师您好,请帮忙讲解一下这个问题

来源:8-5 event loop 的执行过程

慕神0540405

2020-07-22

老师您好,我最近面试碰到一个面试题如下:
var b = ‘2’;
function abc(){
let b = 1;
++b;
setTimeout(() => {
test(‘fun test’);
}, 0);
setTimeout(test(‘test fun’), 1000);
console.log(b);
function test(str){
this.b++;
console.log(str);
console.log(this.b++);
}
}
abc();
在我的理解中,最终的输出顺序应该是:
2,fun test,4,test fun,4
最终我回家自己试过一遍之后的输出结果却是:
test fun,3,2,fun test,5
能给讲解一下吗

写回答

4回答

双越

2020-07-22

function fn() { console.log('callback fn') }

// 第一种情况,我们常见的
setTimeout(fn, 1000)
console.log(100)

// 第二种情况,带坑,就你题目里的样子
setTimeout(fn(), 1000)
console.log(100)

你先把上述代码了解了,这个题目也就能答对了,这里有坑。


(说实话:一开始我也被懵了一下,等了 2 分钟才反应过来的)


0
5
Best_Coder_LCN
回复
慕神0540405
查看setTimeout的文档,这个函数会改变this的取值,会导致this指向window,所以this.b指向的是全局变量。 另外 b++ 和 ++b 是不一样的。所以输出是3 2 5 https://developer.mozilla.org/zh-CN/docs/Web/API/setTimeout
2022-06-25
共5条回复

Best_Coder_LCN

2022-06-25

查看setTimeout的文档,这个函数会改变this的取值,
https://developer.mozilla.org/zh-CN/docs/Web/API/setTimeout
会导致this指向window,所以this.b指向的是全局变量b。 
另外 b++ 和 ++b 是不一样的。所以输出是3 2 5
0
0

fstgshow

2021-03-21

为什么我复制这段代码运行报错TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received undefined
setTimeout(test(‘test fun’), 1000); 这一行报错了

0
1
双越
setTimeout 第一个参数,必须是函数。而你的代码是 test('test fn') 它不会函数,它是一个函数的执行结果。
2021-03-22
共1条回复

慕粉3871079

2021-03-11

这题有坑啊,定时器里跑的test 是已经调用的,不是一个function

0
0

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4641 学习 · 1667 问题

查看课程