全部變量(基本類型、引用類型以及函數)都存在於一個執行環境當中,這個執行環境決定了變量的生命週期,以及哪一部分代碼能夠訪問其中的變量。javascript
每一個執行環境都有一個與之關聯的變量對象,環境中定義的全部變量和函數都保存在這個對象中。前端
執行環境能夠劃分爲兩類:java
全局執行環境windows
全局執行環境是最外圍的一個執行環境。根據ECMAScript實現所在的宿主環境不一樣,表示執行環境的變量對象也不同。例如,在WEB瀏覽器中,與全局執行環境關聯的變量對象是windows
對象。瀏覽器
函數執行環境函數
每一個函數都有本身的執行環境,函數執行環境的變量對象被稱爲活動對象,它在最開始只包含一個變量,即arguments
對象。ui
執行流每進入一個執行環境,都會建立一個做用域鏈。url
做用域鏈由執行環境的變量對象組成,做用域鏈的前端始終是當前執行環境的變量對象,下個變量對象來自外圍環境,再下一個變量對象則來自下一個外圍環境,一直延續到全局執行環境的變量對象。全局執行環境的變量對象始終都是做用域鏈中的最後一個變量對象。code
做用域鏈的用途是保證對執行環境有權訪問的全部變量和函數的有序訪問。對象
當執行流進入try - catch
語句的catch
塊或者進入with
語句,解釋器就會再當前做用域鏈的最前端增長一個變量對象。這個變量對象是臨時的,它會在語句執行完後被移除。
延長做用域鏈的特色是:
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
,函數執行環境中定義了變量qs
和url
。with
語句延長了函數執行環境的做用域鏈,解釋器解析標識符href
會首先在變量對象location
搜所,若是沒有延長做用域機制,咱們沒法解析href
;此外,with
語句不會建立執行環境,若是建立執行環境,當with
語句結束,變量url
將被銷燬,咱們沒法在函數執行環境中訪問,代碼運行結果顯然狀況不是這樣。
JavaScript沒有塊級做用域,變量的聲明週期和執行環境有關。
var
操做符聲明的變量,將會添加到最近的執行環境的變量對象中。
JavaScript經常使用的垃圾收集方式是:
目前,衆瀏覽器廠商推行J的avaScript的垃圾收集方式是標記清除(舊版本IE除外)。