前端面试经典题目
//修改以下代码,使之输出1,2,3,4,5
for(var i=1;i<=5;i++){
    setTimeout(() => {
        console.log(i)
    }, 0)
}
//运行上述代码,输出6,6,6,6,6
//函数执行的顺序类似栈,后进先出,叫做函数调用栈,这里有个特殊的地方,就是setTimeout不在这个调用栈里面执行,而是加
  到一个队列里面,等栈空了才去执行这个队列里面的东西;但是,var声明的变量存在变量提升,循环到最后一次,i=6了,所以每次
  进去的i并不是刚进去的值,而是一个全局的i,这个i就是6,所以会输出6,6,6,6,6
//解法一 let
for(let i=1;i<=5;i++){
    setTimeout(() => {
        console.log(i)
    }, 0)
}
//ES6中let声明的变量没有变量提升,而且变量有块级作用域 注:不能用const声明i,const一般声明一个常量,而且不能改变
//解法二 闭包
for(var i=1;i<=5;i++){
    (function(a){
        setTimeout(function timer() {
            console.log(a)
        }, 0)}
    )(i);
}
//对闭包的理解还不够深刻,就不过多解释了...

关于作者

zhyim
每个字我都认识,连起来就看不懂了
获得点赞
文章被阅读