lzcdev / Daily-Front-End-Questions

每日前端面试题、技巧等知识点,记录自己的成长过程
MIT License
1 stars 0 forks source link

输出什么?(let和var) #30

Open lzcdev opened 5 years ago

lzcdev commented 5 years ago
for (var i = 0; i < 3; i++) { 
  setTimeout(() => {
    console.log(i);
  }, 1);
}

for (let i = 0; i < 3; i++) {
  setTimeout(() => {
    console.log(i);
  }, 1);
}
lzcdev commented 5 years ago

3 3 3 0 1 2

由于 JavaScript 的事件循环,setTimeout 回调会在遍历结束后才执行。因为在第一个遍历中遍历 i 是通过 var 关键字声明的,所以这个值是全局作用域下的。在遍历过程中,我们通过一元操作符 ++ 来每次递增 i 的值。当 setTimeout 回调执行的时候,i 的值等于 3。

在第二个遍历中,遍历 i 是通过 let 关键字声明的:通过 letconst 关键字声明的变量是拥有块级作用域(指的是任何在 {} 中的内容)。在每次的遍历过程中,i 都有一个新值,并且每个值都在循环内的作用域中。