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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文探讨了JavaScript中`setTimeout`函数的行为,解释了传递函数和函数调用作为`setTimeout`参数时的区别,并通过修改`console.log`函数来演示函数调用是如何立即执行的。

先看现象:

        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("我是正常的啊")
        }

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
存储 关系型数据库 MySQL
【面试题精讲】MySQL-redo-log
【面试题精讲】MySQL-redo-log
|
存储 缓存 关系型数据库
【面试题精讲】mysql-innodb_flush_log_at_trx_commit
【面试题精讲】mysql-innodb_flush_log_at_trx_commit
|
SQL 存储 关系型数据库
MySQL通过bin log恢复数据|手撕MySQL|对线面试官
作为《手撕MySQL》系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log)进行数据恢复的功能,并且配合实例演示,让你更懂MySQL。
259 0
MySQL通过bin log恢复数据|手撕MySQL|对线面试官
|
Linux 测试技术
软件测试Linux面试题:三种查看server.log的文件内容
软件测试Linux面试题:三种查看server.log的文件内容
432 0
|
5月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
2月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
2月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
76 4
|
3月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
98 2
|
3月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
40 0

热门文章

最新文章