js執行環境、作用域、作用域鏈、變量提升、函數提升

1.執行環境(execution context)

  執行環境定義了變量和函數有權訪問的其他數據,決定了他們各自的行爲。每個執行環境都有與之對應的變量對象(variable object),保存着該環境中定義的所有變量和函數。我們無法通過代碼來訪問變量對象,但是解析器在處理數據時會在後臺使用到它。

  執行環境有全局執行環境(也稱全局環境)和函數執行環境之分。執行環境如其名是在運行和執行代碼的時候才存在的,所以我們運行瀏覽器的時候會創建全局的執行環境,在調用函數時,會創建函數執行環境。

1.1 全局執行環境

  全局執行環境是最外圍的一個執行環境,在web瀏覽器中,我們可以認爲他是window對象,因此所有的全局變量和函數都是作爲window對象的屬性和方法創建的。代碼載入瀏覽器時,全局環境被創建,關閉網頁或者關閉瀏覽時全局環境被銷燬。

1.2 函數執行環境

  每個函數都有自己的執行環境,當執行流進入一個函數時,函數的環境就被推入一個環境棧中,當函數執行完畢後,棧將其環境彈出,把控制權返回給之前的執行環境。

2 作用域、作用域鏈

2.1 全局作用域(globe scope)和局部作用域(local scope)

全局作用域可以在代碼中的任何地方都能被訪問,局部作用域一般只在固定的代碼片段內可以訪問得到。

2.2 作用域鏈(scope chain)

       全局作用域和局部作用域中變量的訪問權限,其實是由作用域鏈決定的。

  每次進入一個新的執行環境,都會創建一個用於搜索變量和函數的作用域鏈。作用域鏈是函數被創建的作用域中對象的集合。作用域鏈可以保證對執行環境有權訪問的所有變量和函數的有序訪問。

  作用域鏈的最前端始終是當前執行的代碼所在環境的變量對象(如果該環境是函數,則將其活動對象作爲變量對象),下一個變量對象來自包含環境(包含當前還行環境的環境),下一個變量對象來自包含環境的包含環境,依次往上,直到全局執行環境的變量對象。全局執行環境的變量對象始終是作用域鏈中的最後一個對象。

  標識符解析是沿着作用域一級一級的向上搜索標識符的過程。搜索過程始終是從作用域的前端逐地向後回溯,直到找到標識符(找不到,就會導致錯誤發生)。

3 變量提升、函數提升

變量提升,就是把變量聲明提升到函數的頂部,需要注意的是,變量提升只是提升變量的聲明,不會把變量的值也提升上來。

函數提升,就是在代碼開始執行之前,解析器就已經讀取並將函數聲明添加到執行環境中。所以,即使聲明函數的代碼在調用它的代碼後面,js引擎也能把函數聲明提升到頂部。

函數有三種定義方法:函數聲明、函數表達式、Function構造函數。其中只有函數聲明形式才能被提升。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章