Javascript onload=函数vs窗口。onload=函数
使用window.onload=function(){}有什么真正的优势吗;过加载=函数(){}?我知道window.onload看起来更合适,但这不是我选择它的好理由,尤其是它比onload长/慢 经过一些耗时的搜索和测试,这两种方法是唯一两种与浏览器兼容的方法,测试(在相对较新的Chrome/Firefox版本和IE 5.5到9版本上)包括:Javascript onload=函数vs窗口。onload=函数,javascript,onload,Javascript,Onload,使用window.onload=function(){}有什么真正的优势吗;过加载=函数(){}?我知道window.onload看起来更合适,但这不是我选择它的好理由,尤其是它比onload长/慢 经过一些耗时的搜索和测试,这两种方法是唯一两种与浏览器兼容的方法,测试(在相对较新的Chrome/Firefox版本和IE 5.5到9版本上)包括: window.onload // works in all tested browsers onload // works in all tested
window.onload // works in all tested browsers
onload // works in all tested browsers, faster than window.onload
document.onreadystatechange // works twice in some browsers, once in some others, could be confusing
window.onpageshow // works in chrome and firefox, not in IE
window.onreadystatechange // doesn't work
document.onload // doesn't work
document.onpageshow // doesn't work
window.document.onload // doesn't work
我可以找到这篇文章,它是最适合我的问题的文章之一:
它指出,严格模式(“使用严格”;我不打算在我的项目中使用)最终可能导致浏览器与onload不兼容(Firefox和Opera中的ReferenceError)
因此,问题是:除了“使用严格”赋值外,使用直接加载赋值是否还有其他真正的缺点?我需要的是信息,而不是一些无法解释的观点
谢谢
注意:我在问这个问题之前做了搜索(我知道这个问题看起来有点经典),我能找到的最接近的问题是关于window.onload vs,window.onload的其他替代品等
编辑:我创建了这个测试用例,它证明了加载速度有多快。我真的会选择这种微观优化,因为为什么不呢?它们有时很酷。两者都是一样的。。。当您自己调用onload时,javascript假定它是一个全局属性,它是窗口对象的属性。因此,基本上,如果您没有明确地说它是window.onload,那么javascript引擎将为您执行此操作
if (onload === window.onload) {
alert("it's the same"); //true
}
所以,只要你不在乎严格模式,现代浏览器就不会有任何问题。但是,最好使用full window.onload,而不仅仅是onload。如果不输入额外的7个字符,您不会得到多少好处 所有全局函数和变量都在window对象内。因此,当您使用
onload
时,您使用的是window.onload
在名称空间内调用某个对象时,您会付出性能代价:它必须获得对象窗口,然后是onload属性
在调用不带窗口的全局变量时,可能会在其范围内重新定义该变量:
function () {
var onLoad = function() {alert("foo")};
function () {
onLoad();
}
}
在本例中,onload警报为“foo”
因此,您问使用直接加载分配是否存在任何实际的缺点:
onload可能会被重新定义,代码可能无法工作。onload和window.onload是我所知的“onload…比window.onload快”的同义词-您如何测试它?我很难想象你甚至可以衡量两者之间的性能差异。在现实世界的代码中肯定没有性能差异。我的意思是,分配给onload的速度更快,我在不同浏览器的jsperf上尝试过,结果根本没有争议。这是一个新的测试用例,我知道它仍然被认为是一个微观优化,但它也是你可以学习一次并一直应用的东西。你的新测试似乎没有测试任何东西(你只是引用属性),自然两个测试返回的结果对我来说完全相同(在Chrome 28中)。但是,正如您在上面所述,赋值操作确实会产生不同的结果,onload
在这方面似乎比window.onload
稍微快一些。尽管如此,这是一个微小的优化:我的错,如果(XMLHttpRequest)在一些旧的IE浏览器中不起作用,而如果(window.XMLHttpRequest)起作用,那么我发布了错误的链接,所以我认为仅仅遵循一般规则是不够的。@Kaizo:在上面的代码中,onLoad
需要全部小写才能隐藏全局onLoad
属性-假设这就是您演示的内容。@heytools:您所说的“一般规则”是什么意思?您的示例似乎突出了浏览器的一个怪癖,而不是与Kaizo的代码相关。Kaizo的代码试图说明的是,局部范围中的onload
不一定指全局onload属性(即window.onload
),这是不明确的。而window.onload
。局部onload
变量隐藏作用域链中的全局onload
属性。@w3d一般规则=所有全局函数和变量都在窗口对象内。我知道如何使用Chrome并验证window.onload==onload,但这还不足以得出结论,即使在最旧的浏览器/设备中也是如此。关键是,情况并非总是如此<代码>窗口。当您不在全局范围内时,onload
不一定等于onload
。再看看您的示例,这不是浏览器的怪癖,您永远不应该使用if(globalVar)
(如在XMLHttpRequest中),因为当未定义globalVar
时,这会引发异常,而window.globalVar
只是返回未定义的。是的,我需要一个“然而”的解释。不需要7个字符的句子,我已经说过onload更快,而不仅仅是更短。关于您的答案,请参阅我在Kaizo的答案下的第一条评论。这被认为是更好的做法(使用window.onload
),因为它避免了歧义,更易于阅读,从而使您的代码更易于移植,更不容易出错。您可能会毫不犹豫地使用window.top
,但同样的原则也适用。