迷耀
2018-09-28 02:53
采纳率: 100%
浏览 502
已采纳

请问一下下面的代码执行的结果为什么不一样?

for (var i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}

for (let i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}
的执行结果为什么不一样,他们执行的原理分别是什么?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 天际的海浪 2018-09-28 10:41
    已采纳

    var在这里声明的i是全局变量,i始终只有一个。
    你在循环中创建了5个定时器。当定时器触发时,那个循环早就结束了,那时的i的值已经是循环最大值加1了。

    而用 let 声明的是块作用域变量,当在for中使用时每次循环都会在循环体的块作用域内创建一个新的i变量,
    每次循环体块作用域都会与定时器的function函数形成“闭包”,闭包可以让每次块作用域内的i变量保留,不会被系统回收。

    打赏 评论
  • var声明了一个变量,并且可以同时初始化该变量。
    let语句声明一个块级作用域的本地变量,并且可选的赋予初始值。
    const 声明创建一个只读的常量,作用域与let相同。这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次。
    传送门:https://segmentfault.com/a/1190000008734811
    如果有帮到你!
    请采纳下!谢谢!

    打赏 评论

相关推荐 更多相似问题