Javascript 为什么显式调用window对象的方法,性能会莫名其妙地降低
在web环境中,请考虑以下代码:Javascript 为什么显式调用window对象的方法,性能会莫名其妙地降低,javascript,web,Javascript,Web,在web环境中,请考虑以下代码: window.alert('foo'); //code1 alert('foo'); //code2 为什么code2的性能高于code1?为什么会发生这种情况?首先,请记住,许多全局对象(包括所有传统的预定义全局对象)是全局对象的属性,而在浏览器上,全局对象是窗口对象窗口并不特殊,它只是一个引用全局对象的预定义全局对象警报也是预定义的全局警报 window.alert(…)比alert(…)慢,因为在window.alert(…)中,JavaS
window.alert('foo'); //code1
alert('foo'); //code2
为什么
code2
的性能高于code1
?为什么会发生这种情况?首先,请记住,许多全局对象(包括所有传统的预定义全局对象)是全局对象的属性,而在浏览器上,全局对象是窗口对象<代码>窗口并不特殊,它只是一个引用全局对象的预定义全局对象<代码>警报也是预定义的全局警报
window.alert(…)
比alert(…)
慢,因为在window.alert(…)
中,JavaScript引擎首先必须:
窗口
,它最终会将其作为全局对象的属性找到,然后alert
,然后警报(…)
中,它只需:
警报
,它最终会将其作为全局对象的属性找到,然后话虽如此,有两项意见:
警报的速度通常并不重要。:-)<代码>警报
毕竟会占用JavaScript引擎,直到用户将其关闭window.xyz(…)
和xyz(…)
之间的差异也会很小。通常,您会因为其他原因看到window.xyz(…)
(例如,当您想要访问全局范围时,某些其他xyz
在范围内)。(我并不是说它们是好的理由;通常你可以避免这样做,当然,不管怎样,只要有可能,人们都会尽量避免全球性的。)var f=theGlobalFunction;
),然后使用f()
重复调用它。这避免了对全局对象的词汇环境遍历和查找。再说一次:只在非常罕见的情况下才有意义;除非您发现了一个可观察到的性能问题并将其缩小到全局函数调用,否则不要这样做。:-)第一次查找(全局)的时间取决于代码嵌套的深度(以及在到达全局对象之前需要搜索多少词汇环境对象)和全局对象具有多少属性。第二部分,查找属性,仅依赖于第二部分。大量的全局变量(例如,如果在许多元素上使用
id
s,因为这些变量被添加为自动全局变量,则会创建全局变量)可以降低全局查找时间。首先,请记住,许多全局变量(包括所有传统的预定义全局变量)都是全局对象的属性,在浏览器上,全局对象是窗口对象<代码>窗口并不特殊,它只是一个引用全局对象的预定义全局对象<代码>警报也是预定义的全局警报
window.alert(…)
比alert(…)
慢,因为在window.alert(…)
中,JavaScript引擎首先必须:
窗口
,它最终会将其作为全局对象的属性找到,然后alert
,然后警报(…)
中,它只需:
警报
,它最终会将其作为全局对象的属性找到,然后话虽如此,有两项意见:
警报的速度通常并不重要。:-)<代码>警报
毕竟会占用JavaScript引擎,直到用户将其关闭window.xyz(…)
和xyz(…)
之间的差异也会很小。通常,您会因为其他原因看到window.xyz(…)
(例如,当您想要访问全局范围时,某些其他xyz
在范围内)。(我并不是说它们是好的理由;通常你可以避免这样做,当然,不管怎样,只要有可能,人们都会尽量避免全球性的。)var f=theGlobalFunction;
),然后使用f()
重复调用它。这避免了对全局对象的词汇环境遍历和查找。再说一次:只在非常罕见的情况下才有意义;除非您发现了一个可观察到的性能问题并将其缩小到全局函数调用,否则不要这样做。:-)id
s,就会产生)