笔记摘自:《你不知道的 JavaScript(上)》第 3 章 提升
1. 包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理.
2. 变量和函数声明从它们在代码中出现的位置被 "移动" 到了最上面. 这个过程就叫作提升.
3. 只有声明本身会被提升, 而赋值或其他运行逻辑会留在原地.
4. 如果提升改变了代码执行的顺序, 会造成非常严重的破坏.
5. 思考以下代码:
- foo();
- function foo() {
- console.log(a); // undefined
- var a = 2;
- }
foo 函数的声明 (这个例子还包括实际函数的隐含值) 被提升了, 因此第一行中的调用可以正常执行.
上面那段代码实际上会被理解为下面的形式:
- function foo() {
- var a;
- console.log(a);
- a = 2
- }
- foo()
这样就好理解多了.
6. 函数声明会被提升, 但是函数表达式却不会被提升
思考以下代码:
- foo(); // TypeError 类型错误, 实际上它是 undefined
- bar(); // ReferenceError
- var foo = function bar() {
- //...
- }
这个代码片段经过提升后, 实际上会被理解为以下形式:
- var foo;
- foo(); // TypeError
- bar(); // ReferenceError
- foo = function bar() {
- //...
- }
7. 函数优先, 函数会首先被提升, 然后才是变量.
思考以下代码:
- foo(); // 1
- var foo;
- function foo() {
- console.log(1);
- }
- foo = function() {
- console.log(2);
- }
结果输出 1 而不是 2
这段代码会被引擎理解为如下形式:
- function foo() {
- console.log(1);
- }
- foo(); // 1
- foo = function() {
- console.log(2)
- }
注意, var foo 尽管出现在 function foo() ... 的声明之前, 但它是重复的声明(因此被忽略了), 因为函数声明会被提升到普通变量之前.
8. 看以下代码:
var a = 2;
实际上 JavaScript 引擎是这样理解的:
var a; a = 2;
9. 声明本身会被提升, 而包括函数表达式的赋值在内的赋值操作并不会提升.
来源: http://www.bubuko.com/infodetail-2971219.html