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

accessing nested member of global variable can be different

本文关键字:成员 全局变量 嵌套 访问      更新时间:2023-09-26

我在哪里读到访问window.location.href比访问location.href更耗时。为什么会这样?当我们说"window.location.href"时,JS引擎在全局对象"window"中搜索"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();

路1循环大约需要51毫秒,路2循环大约需要35毫秒。会有什么不同?

location是对window.location的引用。

现在,如果您使用location.href,javascript引擎将不得不在本地作用域查找location,如果找不到,它将检查父作用域,直到到达全局作用域,然后获取其href属性。

如果使用window.location.href,则引擎必须首先在本地作用域中查找window,如果找不到,则检查父作用域,直到到达全局作用域。一旦找到,就得到它的location属性,然后得到window.locationhref属性。

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