直接举例子: 1 console.log(a);
解析:控制台会报错,因为a没有定义。
2 console.log(a); var a = 1;
解析:打印underfined,因为js预解析机制把var声明的变量先赋值为打印underfined。
3 console.log(a); a = 1;
解析:控制台会报错,因为没有var声明,js没有预解析。
4 console.log(a); var a = 1; console.log(a); function a(){ console.log(2); } console.log(a); a();
解析:首先预解析,把var a赋值underfined,由于函数a()跟变量var a冲突,所以函数a会把变量a覆盖,声明了a(),变量var a就不存在了,解析完开始执行,第一个console.log打印了a(),由于var a赋值了1,函数变成了变量,第二个console.log打印的是1,function a(){}已经声明了,所以跳过直接走第三个console.log,打印的也是1,然后执行a()会报错,因为a现在是变量。
5 var a = 1; function fn(){ console.log(a); var a = 2; } fn(); console.log(a);
解析:全局变量a和局部变量a先赋值underfined,执行fn(),打印的局部变量a的值是underfined,第二个console打印是全局变量a的值,是1
6 var a = 1; function fn(){ console.log(a); a = 2; } fn(); console.log(a);
解析:全局变量a先赋值underfined,fn()里面的a由于没有var 所以不会预解析,执行fn()会打印1是因为局部变量a找不到,然后找上层作用域的变量a,打印完a被赋值了2,第二个打印是2
7 var a = 1;
function fn(a){
console.log(a);
a = 2;
}
fn();
console.log(a);
解析:全局变量a先赋值underfined,由于局部变量a作为参数来传,所以预解析也给局部变量a赋值了underfined,fn()执行第一个打印是underfined,第二个打印是全部变量的值1.
8 var a = 1;
function fn(a){
console.log(a);
a = 2;
}
fn(a);
console.log(a);
解析:全局变量a先赋值underfined,由于局部变量a作为参数来传,所以预解析也给局部变量a赋值了underfined,fn(a)把1传进去了,执行第一个打印是1,a虽然赋值了2,但是它是局部变量,所以第二个打印是全部变量的值1.