JavaScript 詞法、靜態、動態做用域初級理解

開始以前javascript

  因爲本人也是JavaScript初學者,記錄學習通過,怕之後會忘記。html

  對於JavaScript 初學者來講,最難的不是代碼部分,而是對不少書籍中的術語的理解,大多時候想要理解一段JavaScript書籍中的解釋內容,就會涉及不少術語,在術語不通的狀況下都會對內容理解誤差(致使很難記住所學內容),因爲本人在閱讀書籍時常常會遇到這一問題,因此今天將記下這一基礎內容。前端

1、須要關注點java

  1)執行環境(做用域)函數執行環境 變量做用域瀏覽器

  2)函數做用域和聲明提早函數

  3)自由變量學習

  4)詞法做用域和靜態做用域spa

  5)動態做用域設計

2、解釋htm

  1)執行環境(做用域)變量做用域

    說到執行環境這個詞,對於看過JavaScript高級程序設計的同窗並不陌生,那麼咱們就先來看看什麼是執行環境:

    1.執行環境:簡稱:「環境」,是JavaScript中最重要的一個概念。執行環境定義了變量或函數有權訪問的其餘數據,決定了它們各自的行爲,每一個執行環境都有一個與之關聯的「變量對象(variable object)」,環境中定義的全部變量和函數都保存在這個對象中。咱們編寫的代碼是沒法訪問這個對象的,但解析器在處理數據時會在後臺使用它。

    2.全局執行環境是最外圍的一個執行環境,在Web瀏覽器中,全局執行環境被認爲是window對象,所以全部全局變量和函數都是做爲window對象的屬性和方法來建立的。某個執行環境中的全部代碼執行完畢後,該環境就會被銷燬,保存在其中的全部變量和函數定義也隨之銷燬。

    3.函數執行環境:每一個函數都有本身的執行環境,當執行流進入一個函數時,函數的環境就會被推入一個環境棧中。而在函數執行以後,棧將其環境彈出,把控制權返回給以前的執行環境。 

    4.做用域鏈:它的用途是保證對執行環境有權訪問的全部變量和函數的有序訪問,做用域鏈的前端,始終都是當前執行的代碼所在的環境的變量對象。當代碼在一個執行環境中執行時,會建立變量對象的一個做用域鏈(scope chain)。

                     

  2)聲明提早

    1.聲明提早:javascript的函數做用域是指在函數內聲明的全部變量在函數體內始終是可見的,這意味着變量在聲明以前是可用的,這也是緣由。這步操做是在javascript "預編譯"時進行的,是在代碼運行以前。

// 局部變量優先於全局變量
// 函數嵌套的狀況下,最內層函數變量優先於在它之上的函數變量
var scope = 'global scope';

function checkScope() {
    // body...  
    var scope = 'local scope';

    function nested() {
        var scope = 'nested scope';
        return scope;
    }
    return nested();
}

var scope = checkScope();
console.log('varable scope :', scope) // 'nested scope'

  3)自由變量:在A做用域中使用的變量x,卻沒有在A做用域中聲明(即在其餘做用域中聲明的),對於A做用域來講,x就是一個自由變量。

ar x = 10;
function fn(){
	var b = 20;
	console.log(x + b); // x 就是一個自由變量。
}

  4)詞法做用域和靜態做用域:詞法做用域等同於靜態做用域,靜態做用域規則查找一個變量聲明時依賴的是源程序中塊之間的靜態關係;

  5)動態做用域規則依賴的是程序執行時的函數調用順序。

    靜態做用域和動態做用域的一個重要區別在於:
    靜態做用域規則查找一個變量聲明時依賴的是源程序中塊之間的靜態關係;
    而動態做用域規則依賴的是程序執行時的函數調用順序。
    說的具體點,就是靜態做用域查找的是距離當前做用域最近的外層做用域中同名標識符的聲明,
    而動態做用域則是查找最近的活動記錄

JavaScript 是使用詞法做用域。

關於做用域幾篇比叫好的文章:

http://www.cnblogs.com/zxj159/archive/2013/05/17/3084598.html

http://www.cnblogs.com/wangfupeng1988/p/3992795.html

相關文章
相關標籤/搜索