在 JS 中,关于函数的执行时机

2020-06-10  本文已影响0人  猫的老字号

函数是一种对象,函数是由 Function 构造的

Function.__proto__ === Function.prototype
// >>true

函数的要素

每个函数都有默认的调用时机
let a = 1
function fn(){
  console.log(a)
}
a = 2
fn()
// >>2
函数的调用时机 && setTimeout()
let a = 1
function fn() {
  setTimeout(()=>{
    console.log(a)
}, 0)
}
fn()
a = 2
// >> a = 2

这里的 setTimeout 方法是一个定时器,在定时器到期后即执行代码,定时为默认值 0 时,意味着:“马上”执行代码,实际的延迟时间可能会比期待的(delay 毫秒数)更长。

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

为什么会打印出 6 个 6 ?

同上,因为setTimeout是异步执行,在delay值取为 0 时,“马上”执行代码,所以它会在for循环结束后执行。

此时的变量i,值已经被覆盖成6了,所以会执行6console.log(6)

那如何才能得到符合我们直觉的0 - 5
for循环中使用let声明变量
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
// >> 0, 1, 2, 3, 4, 5
因为在let中,let有自己的作用域块,所以在for循环的表达式中使用let,等价于在代码块中使用let
另一种方法得到0 - 5
let i = 0
for(i = 0; i<6; i++){
    setTimeout((value)=> {
      console.log(value)
    },0,i)
}
// >> 0, 1, 2, 3, 4, 5

i作为参数传入到setTimeout()中即可实现打印出0 - 5

上一篇 下一篇

猜你喜欢

热点阅读