首选局部变量为全局属性和索引值

在将搜索扩展到更大的范围之前,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,这次只需要检查本地范围。