location.href和window.location.href之间的性能差异

时间:2012-05-05 11:55:18

标签: javascript

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

4 个答案:

答案 0 :(得分:8)

  

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

它可能 infinitessimally 更快,但在现实生活中你没有注意到。原因如下:

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

  • 在当前范围内查找location;如果没有找到,则进入包含范围等,最终达到全球范围。
  • 在全局范围内,location被视为全局对象的属性。
  • 然后它会在href对象上查找location属性。

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

  • 在当前范围内查找window;如果没有找到,则进入包含范围等,最终达到全球范围。
  • 在全局范围内,window被视为全局对象的属性;它是全局对象用来引用本身的属性
  • 然后它会在该对象上查找location属性。
  • 然后它会在href对象上查找location属性。

因此window.location.href需要比location.href更多的属性查找 - 除非JavaScript引擎可以应用任何优化。但是从引擎到引擎,JavaScript性能是令人难以置信的变量;你的旅费可能会改变。 Here's a benchmark FB55 put together {{3}}表明上述理论得到了实验结果的证实; location.href确实更快。在那个特定的测试中。

Gratuitous benchmark screenshot

(蓝色= location.href,红色= window.location.href;较长的行=表现更快。)

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

答案 1 :(得分:1)

不推荐使用document.location而支持window.location,它只能通过location访问,因为它是一个全局对象。

location对象有多个属性和方法。如果您尝试将其用作字符串,那么它就像location.href一样。为了安全起见,最好始终使用location.href

答案 2 :(得分:1)

对此的一些想法:

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

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

答案 3 :(得分:0)

初看起来他们做同样的事情,他们可能会有不同的行为,以防你使用框架。

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

请说明您在哪里阅读此内容。

HTH