1. 程式人生 > >Javascript關於作用域和作用域鏈

Javascript關於作用域和作用域鏈

[Scope]:

Javascript引擎中有一個scope的內部屬性,這個scope物件包含了函式可以訪問的作用域物件的集合,並且這個scope屬性只能被瀏覽器所訪問。scope屬性是函式建立就存在的。

function ShowTime(time){

    var time=time;

    function logTime(){

        console.log("it's a new time");

    }
}
var showtime=new ShowTime('2012');
console.log(showtime);

當一個函式被建立,這個函式的作用域鏈中會插入一個物件,這個物件指向了全域性物件,即所有在全域性範圍內定義的變數比如(window,document)

執行環境(執行上下文)

當函式執行時,會建立一個執行環境的物件(與scope是兩個概念)。函式每次執行的執行環境都不一樣。當函式執行完畢,執行環境被銷燬。

執行環境物件也有自己的作用域,當執行環境建立時,其作用域鏈初始化為scope中的物件。這些值(包括了局部變數,引數集合等)被複制到執行環境的作用域鏈中,當這個過程完成,一個"活動物件"就建立好了,隨後這個物件被推入函式作用域鏈的頂端。當執行物件被銷燬,這個活動物件也會被銷燬。

funciton showtime(time){

     var time=time;

}

showTime(2012)

作用域和作用域鏈

當一個函式執行時,會解析所使用的識別符號,而這些識別符號就會在作用域鏈中進行查詢。如果在當前作用域中並未找到,就會到下一個作用域物件中進行查詢。這些作用域物件的集合形成了作用域鏈。

在變數的使用中,應當避免跨作用域查詢識別符號。因為跨作用域查詢識別符號會造成效能消耗。

比如:

在執行showtime(2012)函式中(time為函式內部定義的變數),活動物件處於作用域鏈頂端,全域性變數處於第二索引,因此使用time和document的效能差異會非常大。

因此建議如果需要反覆操作全域性變數時,將全域性變數的值賦給一個區域性變數,能大大減少效能開銷。