2

我已经读过 location.href 比 window.location.href 快。但是在内部 location.href 被读取为 window.location.href 对吗?那么它将如何提高显着的性能呢?

4

4 回答 4

9

我已经读过 location.href 比 window.location.href 快。

它可能会快得多,但在现实生活中你不会注意到。原因如下:

这是引擎在看到时所做的(理论上)location.href

  • location在当前范围内查找;如果没有找到,则转到包含范围,依此类推,最终到达全局范围。
  • 在全局范围内,location作为全局对象的属性被发现。
  • 然后它查找对象的href属性location

这是引擎在看到时所做的(理论上)window.location.href

  • window在当前范围内查找;如果没有找到,则转到包含范围,依此类推,最终到达全局范围。
  • 在全局范围内,window作为全局对象的属性被发现;它是全局对象用来引用自身的属性。
  • 然后它查找location该对象的属性。
  • 然后它查找对象的href属性location

因此,window.location.href它需要更多的属性查找location.href——除非 JavaScript 引擎可以应用任何优化。但是 JavaScript 的性能因引擎而异。你的旅费可能会改变。这是FB55 放在一起的基准,表明上述理论得到了实验结果的证实;确实更快。在那个特定的测试中。location.href

无偿的基准截图

(蓝色 = location.href,红色 = window.location.href;更长的行 = 更快的性能。)

更重要的是:这真的重要吗?不在现实世界中,不。你必须这样做数百万次才能有任何人类可感知的差异。但这就是为什么您会看到人们对全局变量location(或任何其他全局变量,内置或由您自己的代码添加)这样说的解释。

于 2012-05-05T12:02:04.583 回答
1

document.location 被弃用,取而代之的是 window.location,它可以通过 location 访问,因为它是一个全局对象。

位置对象有多个属性和方法。如果您尝试将其用作字符串,则其行为类似于 location.href。为了安全起见,最好始终使用 location.href

于 2012-05-05T11:59:43.080 回答
1

对此的一些想法:

  • 在浏览器中,window是全局对象,因此分配给它的所有属性都可以在不引用它的情况下访问。在这两种情况下,都需要在每个周围的范围内搜索变量(阅读:甚至需要搜索窗口对象)。
  • 为了避免昂贵的搜索,大多数现代浏览器都实现了一种称为“内联缓存”(IC)的技术。简而言之,这意味着您始终指向正确的对象。

无论如何,我创建了一个简单的 benchmark。显然,直接访问更快(至少在 Chrome 中)。

于 2012-05-05T12:09:55.417 回答
0

乍一看,它们做同样的事情,如果您使用框架,它们可能会有不同的行为。

在这种情况下,它们可能会返回不同的值,根据您的框架嵌套复杂性可能会有一些性能差异,但忽略框架的东西,它们会在同一时间做同样的事情。

请说明您在哪里读到这方面的信息。

高温高压

于 2012-05-05T12:01:10.597 回答