簡單說說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

我的博客,引用請註明出處。

相關文章
相關標籤/搜索