標籤:簡單 聲明變數 java 可見 UNC div ext 上下文 變數
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 = 211 return fn312 }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 = 412 }13 var a = 214 return fn315 }16 var fn = fn1()17 fn() //輸出多少
觀察代碼,我們發現在這裡fn() 的結果最終由fn2()決定,在fn3()中fn2()在執行的時候,其內部並沒有聲明變數a,於是向上一級範圍找,找到局部變數a,它雖已聲明但還沒有賦值(賦值在其後),所以最終輸出為 undefined 。
小結一下:
- 函數在執行的過程中,先從自己內部找變數;
- 如果找不到,再從建立當前函數所在的範圍去找, 以此往上;
- 注意找的是變數的當前的狀態。
簡單先寫到這裡吧,有不當之處歡迎批評指正。
個人部落格,引用請註明出處。
簡單說說Javascript中的範圍鏈