预解析
JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程
预解析过程:
- 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
- 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
- 先提升var,在提升function(顺序var在最上面,然后是function)
1.例子:
f1();
console.log(c); //9
console.log(b); //9
console.log(a); //报错
function f1() {
var a = b = c = 9;
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
预解析后:
function f1() {
var a;//有var是局部变量,函数外不能访问
a=9;
// 提升后有没有var,是隐式全局变量,所以函数外可以访问
b=9;
c=9;
console.log(a);//9
console.log(b);//9
console.log(c);//9
}
f1();
console.log(c);// 9
console.log(b);// 9
console.log(a);//报错
2.例子:
f1(); //结果最终是报错
var f1=function () {
console.log(a);
var a=10;
};
预解析后:
//分析
var f1; //预解析,所以f1只进行了声明,f1里面没有内容,
f1(); //报错
f1=function () {
console.log(a);
var a=10;
};