setTimeout引发的刨根问底

2023-11-17

setTimeout定时器)是JavaScript中一个比较重要且常用的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。平时开发可能基本都是使用 setTimeout(fn, ms) 的形式,当然还有比较神奇的用法,特别是在前端面试中,经常被问到。

JavaScript setTimeout

一、setTimeout 介绍

  1. 定义: setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

  2. 语法

setTimeout(code, milliseconds, param1, param2, ...)
setTimeout(function, milliseconds, param1, param2, ...)
参数 描述
code/function 必需。要调用一个代码串,也可以是一个函数。
milliseconds 可选。执行或调用 code/function 需要等待的时间,以毫秒计。默认为 0。
param1, param2, … 可选。 传给执行函数的其他参数(IE9 及其更早版本不支持该参数)。

二、使用

  1. 第一个参数为 code 字符串形式:
setTimeout("console.log('Hello setTimeout')", 2000)
  1. 第一个参数为 function 函数形式(推荐):
setTimeout(function(){
  console.log('Hello setTimeout')
}, 2000)
  1. 传参:
setTimeout(function(params){
  console.log(`参数:${params}`)
  console.log('Hello setTimeout')
}, 2000, 'setTimeout params')

/* 打印输出 */

// 参数:setTimeout params
// Hello setTimeout

三、经典面试题

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

输出: 开始输出一个 5,然后每隔一秒再输出一个 5,一共 5 个 5。
解析: var声明的 i 变量提升

  1. 优化:输出 0 到 4,且每个间隔一秒
for (var i = 0; i < 5; i++) {
  (function(i) {
    setTimeout(function() {
      console.log(i);
    }, i * 1000);
  })(i);
}

解析: 自执行函数形成闭包,而 JS 函数中基本类型的参数传递是按值传递
更加直观的形式:

function output(i) {
  setTimeout(function() {
    console.log(i);
  }, i * 1000);
}

for (var i = 0; i < 5; i++) {
  output(i);
}
  1. 其他方法:
  • 利用 ES6 中的 let 声明的变量形成块级作用域
for (let i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
}
  • 利用 setTimeout 中第三个参数,保持参数的引用。
for (var i = 0; i < 5; i++) {
  setTimeout(function(i) {
    console.log(i);
  }, 1000 * i, i);
}

四、举一反三

  1. 删除自执行函数的参数
for (var i = 0; i < 5; i++) {
  (function() {
    setTimeout(function() {
      console.log(i);
    }, i * 1000);
  })(i);
}

输出: 开始输出一个 5,然后每隔一秒再输出一个 5,一共 5 个 5。

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

直接看不太容易理解,拆解一下:

for (var i = 0; i < 5; i++) {
  var fn = (function(i) {
    console.log(i);
  })(i);
  setTimeout(fn, i * 1000);
  
  // 相当于下边的
  // setTimeout(undefined, i * 1000)
}

输出: 直接输出 0 到 4,中间没有间隔。
解析: fn 接收的是一个没有返回值的自执行函数,所以这里的 fn 为 undefined,相当于执行了 setTimeout(undefined, i * 1000) 无效,也不会报错。


欢迎访问:天问博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

setTimeout引发的刨根问底 的相关文章

随机推荐

  • 翻页特效原理

    http www open open com lib view 1326265166952 实现真实的翻页效果 为了能在翻页的过程中看到下一页的内容 在翻页之前必须准备两张页面 一张是当前页 另一张是下一页 翻页的过程就是对这两张页面的剪切
  • SAGE(SAGEMATH)密码学基本使用方法

    求逆元 inv inverse mod 30 1373 print 30 inv 1373 1 扩展欧几里得算法 d u v xgcd 20 30 print d 0 u 1 v 2 format d u v d 10 u 1 v 1 孙子
  • win10系统显示打印机未连接到服务器,解决win10提示“Windows无法连接到打印机”的方法...

    打印机是我们办公室中必备的设备 如今各种打印方式也是层出不穷 最近有用户在使用win10系统进行打印的时候遇到了这样的提示信息 windows 无法连接到打印机 在更详细的信息提示界面中已经告诉我们是由于本地打印店额后台服务程序没有启用导致
  • void、void 的使用

    void的使用 1 对函数返回值的限定 函数无返回值 void test int a int num a 2 void 限定函数的返回值为任意类型的指针 void test int a 5 int p a return p 3 对函数参数的
  • ASCII unicode utf8 编码、解码的那些事

    ASCII unicode gbk utf8 编码 解码的那些事 对应编码这块一直处于一种懵懵懂懂的状态 有的时候去查了资料 当下理解了 过一段时间又遗忘了 今天又重新查阅了一番资料 记录一下所感所悟 阮一峰老师 关于编码的总结 1 ASC
  • 【学一点儿前端】box-sizing以及flex:1的解释

    box sizing box sizing 是一种用于控制CSS盒子模型行为的CSS属性 它的作用是指定元素的宽度和高度的计算方式 以确定元素的总尺寸 具体来说 box sizing 可以有两个可能的取值 1 content box 默认值
  • hive加载数据权限报错

    前提 上传数据至hdfs 的 user root 下 创建了hive的orc表 准备load数据 创建了临时的ordertmp的textfile格式表 后面用insert overwrite进目标表 执行load data 从 user r
  • 2020-06-07

    Arcgis engine实现栅格运算功能 有大佬能帮助一下吗 arcgis是10 2版本的 环境是vs2015
  • linux的-Mtime 命令

    我在写shell脚本的时候 定时删除一些文件的时候 也经常用得到 mtime这个参数 所以打算好好看看 把它弄明白一下 man find里的解释 mtime n File s data was last modified n 24 hour
  • java ee 运行环境_EE质量检查:为我们的网站开发和运行自动测试

    java ee 运行环境 Introduction 介绍 This article is the last of three articles that explain why and how the Experts Exchange QA
  • 【Python_requests学习笔记(九)】基于requests和threading模块实现多线程爬虫

    基于requests和threading模块实现多线程爬虫 前言 此篇文章中介绍基于 requests 和 threading 模块实现多线程爬虫 并以 抓取Cocos中文社区中 热门主题下的帖子名称及id数据 为例进行讲解 因主要介绍如何
  • 华大单片机HC32L130 / HC32L136 / HC32F030 系列硬件开发指南

    适用对象 系列 产品型号 HC32L130 HC32L130E8PA HC32L130F8UA HC32L130J8TA HC32L130J8UA HC32L136 HC32L136J8TA HC32L136K8TA HC32L130 HC
  • 三角函数常见基本公式

    定义式 图形 正弦 sin 余弦 cos 正切 tan或tg 余切 cot或ctg 正割 sec 余割 csc 函数关系 商数关系 倒数关系 平方关系 和差角公式 二角和差公式 三角和公式 积化和差公式 倍角公式 二倍角公式 三倍角公式 四
  • centos7初始化操作-时间同步/网络防火墙/本地源/ssh/等

    一 chrony安装及配置 验证 说明 协议 NTP协议 时间同步必要场景 集群 日志 加密协议等 相关文章 https blog csdn net weixin 44515412 article details 106875753 1 安
  • 使用Lodop控件打印表单和二维码

    文章目录 1 了解Lodop 1 1Lodop的定义 1 2Lodop主要函数 1 3Lodop的下载 2 在页面中引入Lodop 3 支持的浏览器 4 Lodop的应用 4 1使用Lodop打印表单 4 2打印二维码 1 了解Lodop
  • Python学习笔记(十二)————判断语句相关

    目录 1 布尔类型的定义 2 比较运算符 3 if语句 4 if else语句 5 if elif else语句 1 布尔类型的定义 布尔类型的字面量 True 表示真 是 肯定 False 表示假 否 否定 布尔类型的数据 不仅可以通过定
  • UNI APP---Android端原生插件开发实战(一)

    1 前言 最近一个项目要求我们的产品必须走网络隧道 并且提供了对应的SDK 很明显只能通过原生开发的方式才能实现这个流程 笔者没有做过原生开发 也没有学过java 所以也踩了不少坑啊 花了两天时间总算完成任务 今天系统的总结下步骤 由于是根
  • 第一章 Qt入门

    2017 10 20 HelloZEX 感谢奇趣科技公司 Trolltech Qt门户 https www qt io 为我们提供了Qt 一种图形用户界面框架 利用Qt提供的C 应用程序开发框架 可以轻松实现 一次编写 随处编译 跨平台解决
  • 深度学习过程中测试准确率先上升后下降是为什么?

    很典型的过拟合问题 过拟合问题的表现 在训练过程中的验证准确率前上升 后下降 即在验证集上的表现先好后差 造成过拟合的原因 数据相对模型来说比较简单 即模型的表达能力过剩 在初始训练阶段 模型逐渐开始学习到一些信息 因而在验证集上的表现是提
  • setTimeout引发的刨根问底

    setTimeout 定时器 是JavaScript中一个比较重要且常用的方法 该方法用于在指定的毫秒数后调用函数或计算表达式 平时开发可能基本都是使用 setTimeout fn ms 的形式 当然还有比较神奇的用法 特别是在前端面试中