请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

老师您好,我最近面试碰到一个面试题如下:
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回答

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

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

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

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


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


0 回复 有任何疑惑可以回复我~
  • 提问者 慕神0540405 #1
    老师您好,第二种情况理解了,当传入一个可立即执行的代码时没有延时效果,目前我还有一个问题:
    为什么执行console.log(b)这一句的时候b的值不受test方法中运算结果的影响,但是几个setTimeout函数中的this.b互相影响呢
    回复 有任何疑惑可以回复我~ 2020-07-22 08:59:10
  • 提问者 慕神0540405 #2
    我明白了,老师,我把this取值理解错了
    回复 有任何疑惑可以回复我~ 2020-07-22 09:09:17
  • GTLONGo #3
    老师请问 
          var b = '2'
           this.b++   // 这步不是只是把字符串转换成数字吗
          console.log(b) //  为什么不是2 而是3
    回复 有任何疑惑可以回复我~ 2021-11-23 23:09:34
Best_Coder_LCN 2022-06-25 17:55:26
查看setTimeout的文档,这个函数会改变this的取值,
https://developer.mozilla.org/zh-CN/docs/Web/API/setTimeout
会导致this指向window,所以this.b指向的是全局变量b。 
另外 b++ 和 ++b 是不一样的。所以输出是3 2 5
0 回复 有任何疑惑可以回复我~
fstgshow 2021-03-21 23:30:51

为什么我复制这段代码运行报错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 08:33:50
慕粉3871079 2021-03-11 16:43:42

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信