簡單說說Javascript中的範圍鏈

來源:互聯網
上載者:User

標籤:簡單   聲明變數   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 。

小結一下:

  1. 函數在執行的過程中,先從自己內部找變數;
  2. 如果找不到,再從建立當前函數所在的範圍去找, 以此往上;
  3. 注意找的是變數的當前的狀態。

 

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

個人部落格,引用請註明出處。

 

簡單說說Javascript中的範圍鏈

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.