首選區域性變數為全域性屬性和索引值

在將搜尋擴充套件到更大的範圍之前,Javascript 引擎首先在本地範圍內查詢變數。如果變數是陣列中的索引值,或者是關聯陣列中的屬性,則它將在查詢內容之前首先查詢父陣列。

在處理效能關鍵程式碼時,這會產生影響。以一個常見的 for 迴圈為例:

var global_variable = 0;
function foo(){
    global_variable = 0;
    for (var i=0; i<items.length; i++) {
        global_variable += items[i];
    }
}

對於 for 迴圈中的每次迭代,引擎將查詢 items,查詢專案中的 length 屬性,再次查詢 items,查詢 items 的 index i 處的值,然後最終查詢 global_variable,首先在檢查全域性範圍之前嘗試本地範圍。

對上述功能的高效重寫是:

function foo(){
    var local_variable = 0;
    for (var i=0, li=items.length; i<li; i++) {
        local_variable += items[i];
    }
    return local_variable;
}

對於重寫的 for 迴圈中的每次迭代,引擎將查詢 li,查詢 items,查詢索引 i 的值,並查詢 local_variable,這次只需要檢查本地範圍。