> 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
```