访问全局变量的嵌套成员可以是不同的

时间:2015-10-28 17:41:25

标签: javascript

我在某处读到访问window.location.href比使用location.href更多的时间。为什么会这样?当我们说“window.location.href”时,JS引擎在全局对象“窗口”中搜索“location”成员,同样应该只发生“location.href”,这里JS引擎也会在窗口中搜索位置成员对象本身。 当两个表达式的成员看起来相同时,为什么它们之间存在时间差异。为了看到差异,我在浏览器控制台中运行了以下代码:

function performance(){
    var a;
    console.time('way1');
    for(var loop = 0; loop < 100000; loop++){
        a = window.location.href;
    }
    console.timeEnd('way1');
    console.time('way2');
    for(var loop = 0; loop < 100000; loop++){
        a = location.href;
    }
    console.timeEnd('way2');
}
performance();

way1循环大约需要51ms,而way2大约需要35ms的chrome。会有什么区别?

1 个答案:

答案 0 :(得分:1)

location是对window.location的引用。

现在,如果你使用location.href,javascript引擎将必须在location的本地范围内查找,如果没有找到,它将检查父范围,直到达到全局范围,然后获取它的href属性。

如果您使用window.location.href,则引擎必须首先在本地范围内查找window,如果找不到,请检查父范围,直到达到全局范围。找到后,获取它的location属性,然后获取href的{​​{1}}属性。

因此,两种情况之间还有一个查找步骤,这就是为什么相信两者的性能略有不同。