JavaScript執行環境

執行環境

全部變量(基本類型、引用類型以及函數)都存在於一個執行環境當中,這個執行環境決定了變量的生命週期,以及哪一部分代碼能夠訪問其中的變量。javascript

每一個執行環境都有一個與之關聯的變量對象,環境中定義的全部變量和函數都保存在這個對象中。前端

執行環境能夠劃分爲兩類:java

  • 全局執行環境windows

    全局執行環境是最外圍的一個執行環境。根據ECMAScript實現所在的宿主環境不一樣,表示執行環境的變量對象也不同。例如,在WEB瀏覽器中,與全局執行環境關聯的變量對象是windows對象。瀏覽器

  • 函數執行環境函數

    每一個函數都有本身的執行環境,函數執行環境的變量對象被稱爲活動對象,它在最開始只包含一個變量,即arguments對象。ui

做用域鏈

執行流每進入一個執行環境,都會建立一個做用域鏈url

做用域鏈由執行環境的變量對象組成,做用域鏈的前端始終是當前執行環境的變量對象,下個變量對象來自外圍環境,再下一個變量對象則來自下一個外圍環境,一直延續到全局執行環境的變量對象。全局執行環境的變量對象始終都是做用域鏈中的最後一個變量對象。code

做用域鏈的用途是保證對執行環境有權訪問的全部變量和函數的有序訪問。對象

延長做用域鏈

當執行流進入try - catch語句的catch塊或者進入with語句,解釋器就會再當前做用域鏈的最前端增長一個變量對象。這個變量對象是臨時的,它會在語句執行完後被移除。

延長做用域鏈的特色是:

  1. 添加的變量對象是臨時的,在語句執行完後將被移除
  2. 添加的變量對象不關聯執行環境。這意味着在語句中聲明的變量屬於包含這些特殊語句的執行環境的變量對象。
var location = new Object();
location.href = "https://baidu.com/";

function buildUrl() {
    var qs = "search?wd=%s";
    
    with (location) {
        var url = href + qs;
    }
    alert(url);
}

buildUrl();

全局執行環境中定義了變量location和函數buildUrl,函數執行環境中定義了變量qsurlwith語句延長了函數執行環境的做用域鏈,解釋器解析標識符href會首先在變量對象location搜所,若是沒有延長做用域機制,咱們沒法解析href;此外,with語句不會建立執行環境,若是建立執行環境,當with語句結束,變量url將被銷燬,咱們沒法在函數執行環境中訪問,代碼運行結果顯然狀況不是這樣。

沒有塊級做用域

JavaScript沒有塊級做用域,變量的聲明週期和執行環境有關。

var操做符聲明的變量,將會添加到最近的執行環境的變量對象中。

JavaScript經常使用的垃圾收集方式是:

  • 標記清除
  • 引用計數

目前,衆瀏覽器廠商推行J的avaScript的垃圾收集方式是標記清除(舊版本IE除外)。

相關文章
相關標籤/搜索