简述
理解作用域,重要的是理解 js 解释代码的规范,js 在解释代码的时候会执行这2个步骤:
- 预解释
js 会对 var function 参数做一个预解释,存储起来 - 逐行解释
完成预解释后,会逐行解释代码
例子1
console.log(a)
var a = 1
执行上面的代码,输出的是:
undefined
跟着上面的步骤走就是:
1.预解释:
会去寻找有 var 、function、参数,那么上面的例子会找到 一个 var a
将它存为 undifined
2.逐行解释:
console.log(a)
就会输出一个 undifined
例子 2
console.log(a)
var a = 1;
function fn1(){
console.log(a)
var a = 2
};
fn1();
var a = 3;
function fn1(){
a = 4;
console.log(a)
}
fn1()
console.log(a)
执行上面的代码,输出的是:
undefined
4
4
4
步骤分析
- 预解释
var a = undefined ;
fn1 = function fn1(){
console.log(a)
var a = 2
};
var a = undefined;
fn1 = function fn1(){
a = 4;
console.log(a)
}
经过预解释后 a = undefined;
fn1 = function fn1(){ a = 4; console.log(a) }
2. 逐行解释
console.log(a) => //输出a undefined
var a = 1; => // a 赋值为 1
function fn1(){
console.log(a)
var a = 2
};
fn1(); // 调用 fn1 经预解释 fn1 = function fn1(){
a = 4;
console.log(a)
}
//所以这里赋值 a = 4; 输出a 为 4
var a = 3; //又重新赋值 a = 3;
function fn1(){
a = 4; // 又重新赋值 a = 4;
console.log(a) //输出 a 为 4
}
fn1()
console.log(a) //输出 a 为 4