我已经读过 location.href 比 window.location.href 快。但是在内部 location.href 被读取为 window.location.href 对吗?那么它将如何提高显着的性能呢?
4 回答
我已经读过 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
(或任何其他全局变量,内置或由您自己的代码添加)这样说的解释。
document.location 被弃用,取而代之的是 window.location,它可以通过 location 访问,因为它是一个全局对象。
位置对象有多个属性和方法。如果您尝试将其用作字符串,则其行为类似于 location.href。为了安全起见,最好始终使用 location.href
对此的一些想法:
- 在浏览器中,
window
是全局对象,因此分配给它的所有属性都可以在不引用它的情况下访问。在这两种情况下,都需要在每个周围的范围内搜索变量(阅读:甚至需要搜索窗口对象)。 - 为了避免昂贵的搜索,大多数现代浏览器都实现了一种称为“内联缓存”(IC)的技术。简而言之,这意味着您始终指向正确的对象。
无论如何,我创建了一个简单的 benchmark。显然,直接访问更快(至少在 Chrome 中)。
乍一看,它们做同样的事情,如果您使用框架,它们可能会有不同的行为。
在这种情况下,它们可能会返回不同的值,根据您的框架嵌套复杂性可能会有一些性能差异,但忽略框架的东西,它们会在同一时间做同样的事情。
请说明您在哪里读到这方面的信息。
高温高压