JS 函数的执行时机

简介: 通过一道面试题来分析一下JS 函数的执行时机~

这篇文章主要讲解JS函数执行的时机,在笔试中我们经常会遇到使用 for 循环延时输出 i 的值这类面试题,下面就用这道题来对JS函数执行的时机进行说明

1. let i = 0 放在 for 循环外面

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

例如上面这段代码,输出的结果不是 0,1,2,3,4,5而是 6,6,6,6,6,6

这是因为循环会先被执行,当循环执行结束后 i 的值为 6,之后再执行六次 console.log(i) 操作

setTimeout 函数是让语句尽快执行,但不是现在,会有一定的延迟,在延迟的这段时间中函数完成了 for 循环,所以六次打印操作会在循环结束后一起执行,此时 i 的值为 6 ,所以打印的结果为 6 个 6

2. let i = 0 放在 for 循环里面

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

如果我们将 let i=0 放入 for 循环中,我们就会发现打印出来的是 0,1,2,3,4,5

这是因为 JS 在 for 和 let 一起使用时会在每一次循环多创建一个 i ,所以我们延时打印出来的 i 实际上是 6 个不同的 i ,此时 setTimeout 函数就失去了作用

3. 使用 var i = 0

无论是在 for 循环里面还是外面使用 var i = 0 ,都会定义一个全局变量 i ,所以 var i = 0 放在 for 循环里面或者外面结果都一样,都是 6 个 6 ,与 let i = 0 放在 for 循环外面的结果一样

for(var i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
目录
相关文章
|
4天前
|
JavaScript 前端开发
JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
这篇文章介绍了JavaScript中对象的基本概念和操作,包括对象属性和方法的使用、对象字面量的创建、函数的定义和作用域的概念,以及全局作用域和局部作用域的区别和特性。
JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
|
4天前
|
JavaScript
js中有哪些函数?
js中有哪些函数?
5 0
|
4天前
|
JavaScript 前端开发 Java
JavaScript 特殊函数
JavaScript 特殊函数
6 0
|
4天前
|
JavaScript 前端开发
JavaScript 函数中break,continue,return 的区别
JavaScript 函数中break,continue,return 的区别
11 0
|
4天前
|
JavaScript 前端开发
JS - 立即执行函数
这篇文章解释了JavaScript中的立即执行函数(IIFE,Immediately Invoked Function Expression)的概念和用法,它用于创建局部作用域以避免全局变量的污染。文中提供了多种立即执行函数的示例,展示了如何通过不同的语法结构立即调用函数。
10 0
|
6天前
|
JavaScript 前端开发
JavaScript——实现compose函数
JavaScript——实现compose函数
12 0
|
6天前
|
JavaScript 前端开发
JavaScript——实现一些常用函数
JavaScript——实现一些常用函数
8 0
|
1月前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
39 1
|
2月前
|
JavaScript
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
|
3月前
|
JavaScript 前端开发
【专栏】`Function.prototype.apply` 在JavaScript中用于动态设定函数上下文(`this`)和参数列表
【4月更文挑战第29天】`Function.prototype.apply` 在JavaScript中用于动态设定函数上下文(`this`)和参数列表。它接受两个参数:上下文对象和参数数组。理解`apply`有助于深入JS运行机制。文章分三部分探讨其原理:基本概念和用法、工作原理详解、实际应用与注意事项。在应用中要注意性能、参数类型和兼容性问题。`apply`可用于动态改变上下文、传递参数数组,甚至模拟其他语言的调用方式。通过深入理解`apply`,能提升代码质量和效率。
25 3