【问题标题】:accessing nested member of global variable can be different访问全局变量的嵌套成员可以不同
【发布时间】:2015-10-28 17:41:24
【问题描述】:

我在某处读到访问 window.location.href 比 location.href 花费更多时间。为什么会这样?当我们说 "window.location.href" 时,JS 引擎在全局对象 "window" 中搜索 "location" 成员,对于 "location.href" 也应如此,这里 JS 引擎也会在 window 中搜索 location 成员对象本身。 当寻找两个表达式的成员时,为什么它们之间存在时间差异。要查看差异,我在浏览器控制台中运行了以下代码:

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();

在 chrome 中,way1 循环大约需要 51 毫秒,而 way2 大约需要 35 毫秒。会有什么不同?

【问题讨论】:

  • 一个周期不能进行很好的性能测试
  • 我见过各种基准测试表明在循环内声明变量会影响性能。由于在同一变量上重复 var 被忽略,您在第一个循环中执行此操作,但在第二个循环中没有执行此操作。我建议将 loop 的声明移到顶部,以便循环完全等效,只需将值初始化为 0。这些基准测试表明,每个引擎的处理方式都不同,因此它是否重要或多少取决于您在哪个浏览器中测试。

标签: javascript


【解决方案1】:

location 是对window.location 的引用。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多