1. 程式人生 > >簡單說說Javascript中的作用域鏈

簡單說說Javascript中的作用域鏈

ole strong text TE 結果 span 全局對象 範圍 undefine

Javascript中作用域就是變量與函數的可訪問範圍,即作用域控制著變量與函數的可見性和生命周期。變量的作用域有全局作用域局部作用域兩種。當查找變量的時候,會先從當前上下文的變量對象中查找,如果沒有找到,就會從父級執行上下文的變量對象中查找,一直找到全局上下文的變量對象,也就是全局對象。這樣由多個執行上下文的變量對象構成的鏈表就叫做作用域鏈

看幾個題目:

A :

 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:

 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:

 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. 註意找的是變量的當前的狀態。

簡單先寫到這裏吧,有不當之處歡迎批評指正。

個人博客,引用請註明出處。

簡單說說Javascript中的作用域鏈