天天看點

js 作用域

一、作用域:是我們學習任何語言的都需要認真學習的概念。那在JavaScript中作用域有什麼差別呢?

1、執行環境(execution context):

  執行環境定義了變量和函數有權通路其他資料,決定了他們各自的‘行為’。每個環境都 有一個與之關聯的變量對象(variable object),環境中定義的所有

變量和函數儲存在這個對象。雖然我們編寫的代碼無法通路這個對象,但解析器在處理資料時會在背景使用它。

  全局執行環境是最外圍的一個執行環境。在web浏覽器中,全局執行環境被認為是:window對象。是以所有全局變量和函數都作為window對象的屬性和

方法建立的。

  某個執行環境中所有代碼執行完畢之後,該環境被銷毀,儲存在其中的所有變量和函數定義也随之銷毀(全局執行環境直到應用程式退出--比如關閉目前網頁或者關閉浏覽器----時才被銷毀。)

  每個函數都有自己的執行環境。當執行流進入一個函數的時,函數的環境就會被推入一個環境棧中。而在函數執行之後,棧将其環境彈出,把控制權

傳回給之前的執行環境。程式中的執行流正式由這個友善的機制控制着。

2、作用域鍊:當代碼在一個環境中執行時,會建立變量對象的一個作用域鍊(scope chain)。

  作用:是保證對執行環境有權通路的所有變量和函數有序通路。

  作用域鍊的前端,始終是都是目前執行的代碼所在的環境的變量對象。如果這個環境是函數,則将其活動對象(activation object)做為變量對象。

  函數的活動對象,隻包含一個變量,即arguments對象(這個對象在全局中是不存在的,隻有在函數體内有)。作用域鍊中的下一個變量對象來自包含(外部)環境,而再下一個變量對象則來自下一個包含環境。這樣一直延續到全局環境;而全局環境的變量對象始終是作用域鍊的最後一個對象。

  辨別符解析(根據變量名字)是沿着作用域鍊一級一級地搜尋辨別符的過程。搜尋的過程始終從作用域鍊的前端開始,然後逐級地向後回溯,直至找到

辨別符為止。(如果找不到辨別符,會報錯誤 xxx undefined。)

學習是一種态度,堅持是質變的利器!