天天看點

JavaScript學習-執行環境和作用域

1,執行環境

執行環境,有時也稱為“環境”,執行環境定義了變量和函數有權通路的其他資料,決定了它們各自的行為。每個執行環境都有一個與之關聯的變量對象,環境中定義的所有變量和函數都儲存在這個對象中,我們編寫的代碼無法通路這個對象,但解析器在處理資料時會在背景使用它。

  • 全局執行環境是最外圍的一個執行環境。
  • 每個函數都有自己的執行環境。
  • 執行環境的類型總共隻有兩種—全局和局部(函數)

2,作用域鍊

當代碼在一個環境中執行時,會建立變量對象的一個作用域鍊。作用域鍊的用途,是保證對執行環境有權通路的所有變量和函數的有序通路。

  • 作用域鍊的前端,始終都是目前執行的代碼所在換将的變量對象。
  • 如果執行環境是函數,則将其活動對象作為變量對象。
  • 作用域鍊中的下一個變量對象來自包含(外部)環境,以此類推,再下一個變量對象則來自下一個包含對象。
  • 全局執行環境的變量對象始終都是作用域鍊中的最後一個對象。

3,延長作用域鍊

有些語句可以在作用域鍊的前端添加一個變量對象,該變量對象會在代碼執行後被移出。就是當執行流進入下列任何一個語句時,作用域鍊就會得到加長:

  • try-catch語句的catch塊;
  • with語句。

4,沒有塊級作用域

對于JavaScript來說,由if或for語句中的變量聲明會将變量添加到目前的執行環境,在語句結束後,也依舊會存在于語句外部的執行環境中。 代碼示例:

  • if語句
if(true){
    var color = “blue”;
}
alert(color); // blue
           
  • for語句
for(var i = ; i  < ;i++)\{
    doSomething(i);
}
alert(i); //10
           

5,查詢辨別符

辨別符解析是沿者作用域鍊一級一級的搜尋辨別符的過程。搜尋過程始終從作用域鍊的前端開始,然後逐級向後回溯,直到找到辨別符為止,如果找不到辨別符,則意味着該變量尚未聲明。在嚴格模式下,初始化未經聲明的變量會導緻錯誤。

繼續閱讀