关于js中的作用域链

全局作用域

在页面上直接声明一个变量

var a = 1 
console.log(a) 

输出结果为1
全局作用域相当于页面上有一个window
a 是window中的一个变量
而声明的函数,其内部也是一个作用域将自身内部与全局作用域隔离开来,来行使自己的功能,该过程遵循着一定的规则,请看下文

作用域链

函数在全局作用域下形成了新的小的作用域,与全局隔离开
在层层包裹中的函数 要进行调用时 要判断其定义的值是谁 再执行函数
举个例子

var a = 1
function fn1(){
  function fn2(){
    console.log(a)
  }
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //输出多少

首先先分析调用函数fn1,在fn1的作用域里有fn2的声明fn3的声明以及变量a的声明
最后是返回到fn3,先进行声明提前,之后函数要输出的是fn3,进入fn3的作用域之后有一个声明变量,有一个调用函数fn2
进入fn2的作用域,其执行输出a的值
这时候要判断a为多少。遵循一个规则:先在当前函数的作用域下寻找变量,如果没有返回上一层作用域即声明该函数的作用域寻找是否有声明的变量,如果还没有则继续像上一层作用域寻找。
观察该函数,fn2下并无a的值,其上一层作用域为fn1 该作用域下有a=2,则该函数的输出为2

你可能感兴趣的:(关于js中的作用域链)