作用域
通常代码中变量和函数并不总是可用的,而限定他们可用范围就被称作为作用域。作用域被分为全局作用域和局部作用域两种。
- 全局作用域:即在全局当中任何地方都可用的的作用域,属于window下的作用域。
- 局部作用域:只能在函数内部访问的作用域,变量和函数不能和外界共用。
作用域链
每当声明一个函数的时候会有一个独立的的作用域,遇到函数执行需要调用某一个变量的时候,需要先在当前函数的作用域下寻找。如果当前函数的作用域下找不到该值变量,就需要进入到创建该函数所在的作用域下寻找,以此往上直至找到为止。这样就形成了一条作用域链。
举个例子
例如上述代码,
在function fn1内是一个独立的作用域,在function fn2和function fn3中又是两个独立的作用域。当输出fn1的时候,需要先找到fn1下返回fn3的值。对应到fn3中需要找到fn2输出的a。而在fn2的作用域中,找不到变量a,需要返回到创建function fn2的作用域下寻找,即fn1的作用域中,得到var a = 2,因此代码输出结果为2。
需要遵循以下三条原则
- 函数在执行的过程中,先从自己内部找变量
- 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
- 注意找的是变量的当前的状态