js引擎运行js分为两步: 预解析、代码执行
- 预解析:js引擎会把js里面所有得var还有function提升到当前作用域的最前面
- 代码执行:按照代码书写的顺序从上往下执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
- 变量提升就是把所有的变量声明提升到当前的作用域最前面,不提升赋值操作
- 函数提升就是把所有得函数声明提升到当前的作用域最前面,不提升函数操作
变量提升
console.log(num);
var num = 10;
//输出undefined
这里相当于
var num;
console.log(num);
num = 10;
在预解析的时候把变量声明提升到作用域最前面,而赋值没有提升,所以会输出undefined。
函数提升
在声明匿名函数时,在函数前调用
fun();
var fun = function() {
console.log(123);
}
这样调用会报错,因为这样就相当于
fun();
var fun;
fun = function() {
console.log(123);
}