Javascript疑問五:做用域鏈

?什麼是做用域鏈,如何肯定變量的的做用域javascript

?咱們在寫代碼的過程當中,如何合理的定義變量的做用域html

?全局做用域 & 某文件內的做用域java

【1】javascript DOM 高級程序設計ide

做用域鏈是用來描述一種路徑的術語,沿着該路徑能夠肯定變量的值,或者當函數被調用時要使用的方法。函數

  • 從本質上說,var關鍵字決定了哪一個函數是特定變量的做用域鏈的終點。
    • 沒懂,做用域鏈的終點是函數?
  • 將變量包含在定義函數時的圓括號內,與使用var關鍵字效果相同,即該變量也會包含着函數的做用域:
    • funciton myFunction(myVariable) {...}

 

      function myFunction(){
        var myVariable = 'inside'; //local variable
      }
      console.log(myVariable); //'undefied'

      var myVariable = 'outside'; //global variable
      myFunction();
      console.log(myVariable); //'outside'

      function myFunction2(){
        myVariable = 'inside';  //global varabile
        console.log('funciton2: ' + myVariable);
      }
      var myVariable = 'outside'; //global varabile
      myFunction2();
      console.log(myVariable); //'inside'

 

【2】http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.htmlspa

全局做用域設計

(1)最外層函數和在最外層函數外面定義的變量擁有全局做用域code

(2)全部末定義直接賦值的變量自動聲明爲擁有全局做用域(就是【1】中說的沒有使用var關鍵字定義的變量)htm

(3)全部window對象的屬性擁有全局做用域,window.name、window.location、window.top等對象

局部做用域: 函數內部使用var關鍵字定義的變量,和函數內部定義的函數

這篇文章【2】用圖片形象解釋了函數執行過程當中,標示符搜索的過程。

「在函數執行過程當中,每遇到一個變量,都會經歷一次標識符解析過程以決定從哪裏獲取和存儲數據。該過程從做用域鏈頭部,也就是從活動對象開始搜索,查找同名的標識符,若是找到了就使用這個標識符對應的變量,若是沒找到繼續搜索做用域鏈中的下一個對象,若是搜索完全部對象都未找到,則認爲該標識符未定義。函數執行過程當中,每一個標識符都要經歷這樣的搜索過程。」

考慮到標示符的搜索過程,咱們在寫代碼的時候,「儘可能少使用全局變量」,「一個好的經驗法則是:若是一個跨做用域的對象被引用了一次以上,則先把它存儲到局部變量裏再使用。

相關文章
相關標籤/搜索