setTimeout(console.log(12345), 1000)___经典面试题

先看现象:

        setTimeout(console.log('12345'), 1000)
        setTimeout(()=>{console.log('67890')},1000)

在这里插入图片描述
例1:

        for (var i = 0; i < 10; i++) {
            setTimeout(console.log(i), 1000)
        }

在这里插入图片描述
例2

        for (var i = 0; i < 10; i++) {
            setTimeout(()=>{ console.log(i)}, 1000)
        }

在这里插入图片描述
例子1和例子2的区别

主要在于定时器的第一个参数,是一个函数还是一个函数的调用。
我们传入一个函数对的调用,他会立马执行,并不会管第二个参数多少毫秒。
当我们传入一个函数的时候(函数体),他会等毫秒数到了一定条件后执行函数。

我们打印一下console这个构造函数
在这里插入图片描述
所以:我们例1就是第一个参数传入了一个函数调用

        for (var i = 0; i < 10; i++) {
            setTimeout(console.log(i), 1000)
        }

他会立即执行。

下面我们改写一下底层的console.log这个函数:

函数体的代码是在一秒钟之后执行的

传入函数体

        let num =10
         console.log = function(params=10){
             num++
             params+=num
             console.dir(params)
         }
        for (var i = 0; i < 10; i++) {
            setTimeout(()=>{ console.log(i)}, 1000)
        }

或者

      let num =10
         console.log = function(params=10){
             num++
             params+=num
             console.dir(params)
         }
        for (var i = 0; i < 10; i++) {
            setTimeout( console.log, 1000)
        }

在这里插入图片描述

传入函数调用:

函数体的代码是在立即执行的

        let num =10
         console.log = function(params=10){
             num++
             params+=num
             console.dir(params)
         }
        for (var i = 0; i < 10; i++) {
            setTimeout( console.log(), 1000)
        }

主要区分setTimeout的第一个参数是函数还是函数调用

函数:等待定时时间到了执行函数;
函数调用:直接执行函数。

个人理解:

在浏览器读取代码提取到定时器的调用栈中,这个时候需要先将函数读取,加入到定时器调用栈,是函数的话,等待EQ,进而执行;是函数体的话读取就等于结束,读取的时候直接调用了这个函数,并没有走定时器调用栈,按照同步代码执行。
例子:

        for (var i = 0; i < 10; i++) {
            setTimeout( console.log("我是定时器里面输出的"+i), 1000)
            console.log("我是正常的啊")
        }

在这里插入图片描述
没有任何延迟的全部输出,同步。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值