* [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