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)
}
目录
相关文章
|
1月前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
42 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
1月前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
2月前
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
2月前
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
2月前
|
JavaScript 前端开发
js教程——函数
js教程——函数
44 4
|
2月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
21 2
|
2月前
|
存储 JavaScript 前端开发
JavaScript数据类型全解:编写通用函数,精准判断各种数据类型
JavaScript数据类型全解:编写通用函数,精准判断各种数据类型
44 0
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-函数的参数
关于JavaScript函数参数基础知识的介绍。
33 4
JavaScript基础知识-函数的参数
|
3月前
|
JavaScript 前端开发
JavaScript 函数参数
JavaScript 函数参数
34 3
|
5月前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
60 1