js的预解析
1、我们js引擎运行分为两步: 预处理 代码执行
- (1)预解析 时候,会把js代码里面的所有var 和function提升到当前作用域的最前面
- (2)代码执行 按照代码书写的从上往下执行
2、预解析分为 变量预解析(变量提升) 函数预解析(函数提升)
(1)变量提升 就是把所有的变量声明提升到当前作用域的最前面 【只提升 声明 不提升赋值操作】
console.log(num); //打印出来是undefine
var num = 10; //因为把声明var num提升到最上面,但并没赋值,所以打印undefine
(2)函数提升也是同理 把所有函数声明提升到当前作用域最前面【只提升 不调用函数】
fu();
function fu(){ //js预编译会将函数声明提升到作用域最上面,然后再调用函数
console.log('11');
}
【注意:用关键字声明函数可以提升,但是采取赋值形式就不能进行提升】
(3)还有一种特殊情况
fun(); //报错
var fun = function(){ //把变量var fun提升到代码作用域的最上面
console.log(22);
}
//相当于执行了以下代码
var fun;
fun(); //这里就直接调用了fun函数,没有给fun定义函数。
fun = function(){
console.log(22);
}
特殊案例
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
//相当于var a = 9 ;b = 9 ;c = 9;
//因为b 和 c直接赋值,没有进行var的声明,因此当作全局变量来看。
var a=b=c=9;
console.log(a);
console.log(b);
console.log(c);
}
//相当于以下代码
function f1(){
var a;
a=b=c=9;
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
// 最后输出
// 9 9 9 9 9 undefine