简单说说Javascript中的做用域链

    Javascript中做用域就是变量与函数的可访问范围,即做用域控制着变量与函数的可见性和生命周期。变量的做用域有全局做用域局部做用域两种。当查找变量的时候,会先从当前上下文的变量对象中查找,若是没有找到,就会从父级执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫作做用域链函数

看几个题目:spa

A :code

 1 var a = 1
 2 function fn1(){
 3   function fn2(){
 4     console.log(a)
 5   }
 6   function fn3(){
 7     var a = 4
 8     fn2()
 9   }
10   var a = 2
11   return fn3
12 }
13 var fn = fn1()
14 fn() //输出多少

          观察代码,咱们发如今这里  fn() 的结果最终由   function fn2(){console.log(a)} 决定,执行fn2,但在其中没有声明a,因而在其上一级做用域中寻找,发现存在局部变量 var a = 2  ,因而执行第4行 console.log(a) ,最终输出为 2  。对象

B:blog

 1 var a = 1
 2 function fn1(){
 3   function fn3(){
 4     var a = 4
 5     fn2()
 6   }
 7   var a = 2
 8   return fn3
 9 }
10 function fn2(){
11   console.log(a)
12 }
13 var fn = fn1()
14 fn() //输出多少

          观察代码,咱们发如今这里fn() 的结果最终由 function fn2(){console.log(a)} 决定,执行fn2,但在其中没有声明a,因而在其上一级做用域中寻找,发现存在全局变量 var a = 1,因而最终结果输出为1 。生命周期

C:ip

 1 var a = 1
 2 function fn1(){
 3 
 4   function fn3(){
 5     function fn2(){
 6       console.log(a)
 7     }
 8     var a
 9 
10     fn2()
11     a = 4
12   }
13   var a = 2
14   return fn3
15 }
16 var fn = fn1()
17 fn() //输出多少

          观察代码,咱们发如今这里fn() 的结果最终由fn2()决定,在fn3()中fn2()在执行的时候,其内部并无声明变量a,因而向上一级做用域找,找到局部变量a,它虽已声明但尚未赋值(赋值在其后),因此最终输出为 undefined 。作用域

小结一下:博客

  1. 函数在执行的过程当中,先从本身内部找变量;
  2. 若是找不到,再从建立当前函数所在的做用域去找, 以此往上;
  3. 注意找的是变量的当前的状态。

 

简单先写到这里吧,有不当之处欢迎批评指正。io

我的博客,引用请注明出处。

相关文章
相关标签/搜索