一道js面试题
```
for(var i=0; i<10; i++){
  setTimeout(function() {
    console.log(i);
  },0)
}
```
请问输出什么？
如果要输出'0123456789'，要怎么改？
推荐将 `var` 替换为 `let`，拥抱 es6 吧。
```
for(let i=0; i<10; i++){
  setTimeout(function() {
    console.log(i);
  },0)
}
```
这里简单说明一下为什么如此替换会有效。
1. 
`var` 命令声明的变量，在全局范围内有效。例中代码，全局只有一个变量 `i`。每一次循环，`i` 的值均会改变，而 `console.log(i)` 里面的 `i` 指向的就是全局的 `i`，导致运行时输出的是最后一轮的 `i` 的值，即 `10`。
2. 
`let` 命令声明 的变量，仅在块级作用域内有效。修改后的代码，每一次循环的 `i` 都是一个新的变量，所以最后输出 `0123456789`。

另外一点，如果每一轮循环的变量 `i` 均为重新声明，那它怎么知道上一轮循环的值？
因为记得。`JavaScript` 引擎内部会记住上一轮循环的值，初始化本轮的变量 `i` 时，就在上一轮循环的基础上进行计算。