预解析
- var和function关键词会预先解析
- 提前赋值
- var a = 10 提前解析为var a(此时a的值为undifined)
- 函数,在正式运行代码前赋值为整个函数块
- 预解析结束后,在逐行解读代码
console.log(a)
var a = 1;
//解析过程
var a;
console.log(a)
a = 1;
console.log(b);
var b = 123;
function b(){
console.log(456)
};
解析过程
var b;
//函数,在正式运行代码前,赋值为整个函数块
function b(){
console.log(456)
};
console.log(b);
b = 123;
console.log(a)
var a=1;
function a(){console.log(2)}
console.log(a)
var a=3;
console.log(a)
function a(){console.log(4)}
console.log(a)
//解析过程
//预解析的过程
var a;
function a(){console.log(2)}
function a(){console.log(4)}
//逐行解析
console.log(a) // function a(){console.log(4)}
a = 1;
console.log(a) // 1
a = 3;
console.log(a) //3
console.log(a) //3
作用域
es5中只有全局作用域和局部作用域之分(函数内的为局部作用域)
函数内可以取全局作用域 全局不可以取局部作用域
var a=1; //全局作用域
function fn1(){
console.log(a)//拿得到a
};
fn1()
function fn1(){
var a=1; //局部作用域
};
fn1();
console.log(a);//拿不到a
扩展
//1)
var a = 1;
function f1(){
console.log(a);
};
f1(); //1
//2)
function f1(){
var a = 1;
};
f1();
console.log(a); //报错
//3)
var a = 1;
function f1(){
console.log(a);
a = 2;
};
f1(); //1
console.log(a); //2
//4)
// 全局变量和局部变量同名的坑
// (1)在全局变量和局部变量不同名时,其作用域是整个程序。详见(3)
// (2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。详见(4)
var a = 1;
function f1(){
console.log(a);
var a = 2;
//解析过程
// var a;
// console.log(a)
// a = 2;
};
f1(); //undefined
console.log(a); //1
面试题
//面试题1
var a = 10;
function f1(){
var b = 2 * a;
var a = 20;
var c = a+1;
console.log(b);
console.log(c);
}
f1();
//f1()解析过程
var b;
var a;
var c;
b = 2*a //NAN
a = 20;
c = 21;
console.log(b); //NAN
console.log(c); //21
//面试题2
var a=10;
function test(){
console.log(a);
a=100;
console.log(this.a);
var a;
console.log(a);
}
test();
//test()解析过程
var a;
console.log(a); //undefined
a = 100;
console.log(this.a); //this === window var a=10;
console.log(a); //100