JS作用域链

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。这就是最终的结果。

你可能感兴趣的:(JS作用域链)