JavaScript 函数的执行时机

87 阅读1分钟

调用函数意味着将代码存进内存,然后逐步执行,不同的调用时机会得到不同的结果。

如下代码会打印什么?

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

setTimeout方法的意思是尽快执行 ,也就是在手头的事情做完之后,再执行。这样的行文我们称之为异步任务。

执行时会被浏览器丢到另一个任务队列里去,浏览器这时候会继续往下执行,把下面的代码都执行完了才回来执行setTimeout方法里的代码,而这时候for循环已经把i加到6了,所以输出结果为6个6。

那么怎样修改,可以打印 0、1、2、3、4、5?

    for (let i = 0; i < 6; i++) {
        setTimeout(()=> {
            console.log(i)
        },0)
    }
  • 当let关键字用于循环体中声明i,let关键字自动帮你在每个循环体里拷贝一个i。因此每个打印出来的i都是当下的i。

除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?

    let i = 0
    for(i = 0; i<6; i++){
        const/let x = i
        setTimeout(()=>{
        console.log(x)
        }, 0)
    }
  • 只要手动把循环体里当前的i存储下来,就可以啦!