Javascript關於作用域和作用域鏈
阿新 • • 發佈:2018-11-13
[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的效能差異會非常大。
因此建議如果需要反覆操作全域性變數時,將全域性變數的值賦給一個區域性變數,能大大減少效能開銷。