JS性能提示的多个来源鼓励开发人员减少"范围链查找".例如,当您访问全局变量时,IIFE被吹捧为具有"减少范围链查找" 的额外好处.这听起来很合乎逻辑,甚至可能被视为理所当然,所以我没有质疑智慧.像许多其他人一样,我一直很高兴地使用IIFE认为除了避免全局命名空间污染之外,还会比任何全球代码都提升性能.
我们今天的期望:
(function($, window, undefined) {
// apparently, variable access here is faster than outside the IIFE
})(jQuery, window);
Run Code Online (Sandbox Code Playgroud)
人们会期望:将这简化/扩展到一般情况:
var x = 0;
(function(window) {
// accessing window.x here should be faster
})(window);
Run Code Online (Sandbox Code Playgroud)
根据我对JS的理解,全球范围内x = 1;和之间没有区别window.x = 1;.因此,期望它们具有同等性能是合乎逻辑的,对吧?错误.我进行了一些测试,发现访问时间存在显着差异.
好吧,也许如果我将window.x = 1;内部放置在IIFE中,它应该运行得更快(即使只是略微),对吧?又错了.
好吧,也许是Firefox; 让我们试试Chrome吧(V8是JS速度的基准,是吗?)它应该击败Firefox以获取直接访问全局变量等简单的东西,对吧?又错了.
因此,我开始在两个浏览器的每一个中确切地找出哪种访问方法最快.所以我们假设我们从一行代码开始:var x = 0;.在x声明(并愉快地附加window)之后,这些访问方法中哪一个会最快,为什么?
直接在全球范围内
x = x + 1;
Run Code Online (Sandbox Code Playgroud)直接在全球范围内,但前缀为 window
window.x = window.x + …Run Code Online (Sandbox Code Playgroud)因此,(桌面)浏览器中有许多内置的全局属性.例如:
documentundefinedparseIntJSONlocationalertsetTimout在引用这些属性时,是否应该通过在其名称前加上明确地将它们标记为全局属性window.?所以,例如:
var wrap = window.document.getElementById('wrap');
Run Code Online (Sandbox Code Playgroud)
和
window.setTimeout(loop, 100);
Run Code Online (Sandbox Code Playgroud)
和
var x = window.parseInt(input.value, 10);
Run Code Online (Sandbox Code Playgroud)
我认为这个问题有三个答案:
是的,window.X在引用全局属性时应始终写.
不,你不必写window.X.只要X是好的.
这取决于财产.对于某些属性,请使用window.X,对于某些其他属性使用X.(如果这是你的答案,请详细说明.)
那么,这是什么?