作用域与作用域链

作用域

通常代码中变量和函数并不总是可用的,而限定他们可用范围就被称作为作用域。作用域被分为全局作用域和局部作用域两种。

  • 全局作用域:即在全局当中任何地方都可用的的作用域,属于window下的作用域。
  • 局部作用域:只能在函数内部访问的作用域,变量和函数不能和外界共用。

作用域链

每当声明一个函数的时候会有一个独立的的作用域,遇到函数执行需要调用某一个变量的时候,需要先在当前函数的作用域下寻找。如果当前函数的作用域下找不到该值变量,就需要进入到创建该函数所在的作用域下寻找,以此往上直至找到为止。这样就形成了一条作用域链。

举个例子

作用域与作用域链_第1张图片
作用域链.png

例如上述代码,
在function fn1内是一个独立的作用域,在function fn2和function fn3中又是两个独立的作用域。当输出fn1的时候,需要先找到fn1下返回fn3的值。对应到fn3中需要找到fn2输出的a。而在fn2的作用域中,找不到变量a,需要返回到创建function fn2的作用域下寻找,即fn1的作用域中,得到var a = 2,因此代码输出结果为2。

需要遵循以下三条原则
  1. 函数在执行的过程中,先从自己内部找变量
  2. 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
  3. 注意找的是变量的当前的状态

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