* [14.1](https://github.com/yuche/javascript#14.1)?`var`?聲明會被提升至該作用域的頂部,但它們賦值不會提升。`let`?和?`const`?被賦予了一種稱為「[暫時性死區(Temporal Dead Zones, TDZ)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let)」的概念。這對于了解為什么?[type of 不再安全](http://es-discourse.com/t/why-typeof-is-no-longer-safe/15)相當重要。
~~~
// 我們知道這樣運行不了
// (假設 notDefined 不是全局變量)
function example() {
console.log(notDefined); // => throws a ReferenceError
}
// 由于變量提升的原因,
// 在引用變量后再聲明變量是可以運行的。
// 注:變量的賦值 `true` 不會被提升。
function example() {
console.log(declaredButNotAssigned); // => undefined
var declaredButNotAssigned = true;
}
// 編譯器會把函數聲明提升到作用域的頂層,
// 這意味著我們的例子可以改寫成這樣:
function example() {
let declaredButNotAssigned;
console.log(declaredButNotAssigned); // => undefined
declaredButNotAssigned = true;
}
// 使用 const 和 let
function example() {
console.log(declaredButNotAssigned); // => throws a ReferenceError
console.log(typeof declaredButNotAssigned); // => throws a ReferenceError
const declaredButNotAssigned = true;
}
~~~
* [14.2](https://github.com/yuche/javascript#14.2)?匿名函數表達式的變量名會被提升,但函數內容并不會。
~~~
function example() {
console.log(anonymous); // => undefined
anonymous(); // => TypeError anonymous is not a function
var anonymous = function() {
console.log('anonymous function expression');
};
}
~~~
* [14.3](https://github.com/yuche/javascript#14.3)?命名的函數表達式的變量名會被提升,但函數名和函數函數內容并不會。
~~~
function example() {
console.log(named); // => undefined
named(); // => TypeError named is not a function
superPower(); // => ReferenceError superPower is not defined
var named = function superPower() {
console.log('Flying');
};
}
// the same is true when the function name
// is the same as the variable name.
function example() {
console.log(named); // => undefined
named(); // => TypeError named is not a function
var named = function named() {
console.log('named');
}
}
~~~
* [14.4](https://github.com/yuche/javascript#14.4)?函數聲明的名稱和函數體都會被提升。
~~~
function example() {
superPower(); // => Flying
function superPower() {
console.log('Flying');
}
}
~~~
* 想了解更多信息,參考?[Ben Cherry](http://www.adequatelygood.com/)?的?[JavaScript Scoping & Hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting)。
- 關于
- 1. 類型
- 2. 引用
- 3. 對象
- 4. 數組
- 5. 解構
- 6. 字符串
- 7. 函數
- 8. 箭頭函數
- 9. 構造函數
- 10. 模塊
- 11. Iterators & Generators
- 12. 屬性
- 13. 變量
- 14. 提升
- 15. 比較運算符 & 等號
- 16. 代碼塊
- 17. 注釋
- 18. 空白
- 19. 逗號
- 20. 分號
- 21. 類型轉換
- 22. 命名規則
- 23. 存取器
- 24. 事件
- 25. jQuery
- 26. ECMAScript 5 兼容性
- 27. ECMAScript 6 編碼規范
- 28. 測試
- 29. 性能
- 30. 資源
- 31. 使用人群
- 32. 翻譯
- 33. JavaScript 編碼規范說明
- 34. 一起來討論Javascript
- 35. Contributors
- 36. License