一、预解析过程
预解析:在js文件或者script里面的代码在正式执行开始之前,进行的一些解析工作,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数
“变量声明提升,函数整体提升”
console.log(a) => undefined
var a = 10;
之所以是undefined是因为变量声明提前了,等同于下方
var a;
console.log(a);
a = 10;
下面例子预解析过程
var test = 10;
function test() {
};
解析过程如下
var test;
function test() {};
test = 10;
测试
console.log(d) //=> d() {console.log(123);}
var d = 11;
console.log(d) //=> 11
function d() {
console.log(123);
}
解析过程
var d;
function d() {
console.log(123);
}
console.log(d)
d = 11;
console.log(d)
二、作用域:
全局作用域和函数作用域
var m = 10; // 全局作用域
function test() {
var n = 100; // 函数作用域
console.log(m) => 10
}
var x = 1;
function f1() {
var y = 2;
function f2() {
var z = y; // z = 2
y = x; // y = 1
x = z; // x = 2
console.log(x,y,z); => 2 1 2
}
f2();
}
f1();
作用域分解
第一种:
var a1 = 1;
function f1() {
console.log(a1)
};
f1();
结果: 1
第二种:
function f2() {
var a2 = 2;
}
f2();
console.log(a2);
结果: a2 is not defined
第三种:
var a3 = 3;
function f3() {
console.log(a3);
a3 = 31;
}
f3();
console.log(a3);
结果: 3 、31
第四种:
var a4 = 4;
function f4() {
console.log(a4);
var a4 = 41;
}
f4();
console.log(a4);
结果:undefined 、 4
面试题:
var a = 10;
function f5() {
var b = 2 * a; // => 2 * undefined => NaN
var a = 20;
var c = a + 1;
console.log(b);
console.log(c);
};
f5();
结果 :NaN 21
// 当全局变量和局部变量不同名时,全局变量的作用域是整个程序
// 当全局变量和局部变量同名时,全局变量的作用域不包含局部变量的作用域
网友评论