> 1. 从`var` 到 `let/const`
> 2. 从`IIFS`到`blocks`
> 3. 从连接字符串到模板文字
> 4. 从函数表达式到箭头表达式
> 5. 处理多个返回值
> 6. 从`for`到`forEach()`再到`for-of`
> 7. 处理参数缺省值
> 8. 处理命名参数
> 9. 从`arguments`到剩余参数
> 10. 从`apply()`到`(...)`
> 11. 从`concat`到`(...)`
> 12. 从对象表达式到方法定义的函数表达式
> 13. 从构造函数到类
> 14. 从自定义错误构造函数到错误的子类
> 15. 从对象到`Maps`
> 16. 新的字符串方法
> 17. 新的数组方法
> 18. 从`CommonJS`模块到`ES6`模块
> 19. 接下来呢?
## 1. 从`var` 到 `let/const`
在ES5中,我们通过`var`来声明变量.这些参数都是`function-scoped`,它们的作用域是最内层的包含函数.`var`的行为偶尔也会引起困扰,例如:
```javascript
var x = 3;
function func(randomize) {
if (randomize) {
var x = Math.random(); // (A) scope: whole function
return x;
}
return x; // accesses the x from line A
}
func(false); // undefined
```
`func()`返回未定义的可能是令人惊讶的。您可以看到为什么通过重写代码,以便它更紧密地反映了实际运行结果:
```javascript
var x = 3;
function func(randomize) {
var x;
if (randomize) {
x = Math.random();
return x;
}
return x;
}
func(false); // undefined
```