#### 声明提升
```
a = 2;
var a;
console.log(a); //2
//等同于
var a;
a = 2;
console.log(a);
```
```
console.log(a); //undefined
var a = 2;
//等同于
var a;
console.log(a);
a = 2;
```
var a = 2其实在解析的时候被拆成了两个声明:var a和a = 2,第一个是在编译阶段执行的,称为定义声明;第二个是在执行阶段执行的,称为赋值声明。
普通变量、函数声明会被提升,而函数表达式不会被提升。
```
foo(); //会执行,只不过输出结果是undefined
function foo(){
console.log(a); //undefined
var a = 2;
}
//等同于
function foo(){
var a;
console.log(a);
a = 2;
}
foo();
```
```
//undefined(),抛出TypeError异常
foo(); //TypeError
var foo = function (){...}
```
即使是具名的函数表达式也不可以
```
foo();
bar();
var foo = function bar(){...}
//等同于
var foo;
foo();//TypeError
bar();//ReferenceError
foo = function (){var bar = ...self...}
```
#### 提升顺序
函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量。
```
foo();
var foo;
function foo(){console.log(1)}
foo = function(){console.log(2)}
//等同于
function foo(){console.log(1)}
foo();
foo = function(){console.log(2)}
```
由于function foo被提升到了最前面,后面的foo声明被认为是重复的声明,被舍去,所以var foo就不存在了。因此要避免重复声明,特别是当var和函数声明混在一起时不要使用相同的变量名,会引起很多危险的问题。
- 你不知道的JS上
- 第一部分 第三章 函数作用域和块作用域
- 第一部分 第四章 提升
- 第一部分 第五章 闭包
- 第二部分 第一章 关于this
- 第二部分 第二章 this全面解析
- 第二部分 第三章 对象
- 第二部分 第五章 原型
- 第二部分 第六章 行为委托
- 你不知道的JS中
- 第一部分 第二章 值
- 第一部分 第三章 原生函数
- 第一部分 第四章 强制类型转换
- 第一部分 第五章 语法
- 第二部分 第一章 异步
- 第二部分 第三章 Promise
- 第二部分 第四章 生成器
- 第二部分 第五章 性能
- 你不知道的JS下
- 第一部分 总结
- 第二部分 第二章 语法
- 第二部分 第三章 代码组织
- 第二部分 第四章 Promise
- 第二部分 第五章 集合
- 第二部分 第六章 新增API
- 第二部分 第七章 元编程
- 第二部分 第八章 ES6之后