Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript onload=函数vs窗口。onload=函数_Javascript_Onload - Fatal编程技术网

Javascript onload=函数vs窗口。onload=函数

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=function(){}有什么真正的优势吗;过加载=函数(){}?我知道window.onload看起来更合适,但这不是我选择它的好理由,尤其是它比onload长/慢

经过一些耗时的搜索和测试,这两种方法是唯一两种与浏览器兼容的方法,测试(在相对较新的Chrome/Firefox版本和IE 5.5到9版本上)包括:

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 vswindow.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
,但同样的原则也适用。