簡單說說Javascript中的作用域鏈
阿新 • • 發佈:2018-06-24
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 vara = 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 functionfn3(){ 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 2function 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 。
小結一下:
- 函數在執行的過程中,先從自己內部找變量;
- 如果找不到,再從創建當前函數所在的作用域去找, 以此往上;
- 註意找的是變量的當前的狀態。
簡單先寫到這裏吧,有不當之處歡迎批評指正。
個人博客,引用請註明出處。
簡單說說Javascript中的作用域鏈