1. 作用域
JS中的变量和函数并不总是可用的,有其使用的范围,这就是作用域。
- JS的作用域靠函数形成,函数内声明的变量是局部变量,在函数外不可访问。
- 不在函数内声明的变量是全局变量。且函数内省略var声明的变量也是全局变量。
2. 作用域链
作用域链决定了哪些数据能被函数访问
举个例子
var a = 1; //全局变量
function fn1(){ //父函数
function fn2(){ //子函数
console.log(a);
}
function fn3(){ //子函数
var a = 4; //局部变量
fn2();
}
var a = 2; //父函数的局部变量对子函数可见
return fn3;
}
var fn = fn1(); //调用函数fn1
fn(); //2
函数在执行过程中,先从自己内部找变量,如果找不到,再从创建当前函数所在的作用域中查找,即层层向上往父级作用域中查找变量。沿着作用域链找变量。
函数fn1返回函数fn3的值,fn3调用了fn2,fn2要求输出变量a的值,函数fn2内部并没有定义变量a,fn2的父函数是fn1,所以往父函数fn1的作用域中查找,由代码可见,fn1中有var a =2; 所以找到fn2输出变量a的值为2。这就是最终的结果。