onload = function vs window.onload = function

时间:2013-07-04 15:14:25

标签: javascript onload

使用window.onload = function(){}是否有任何真正的好处; over onload = function(){}; ?我知道window.onload看起来更合适,但这不是我选择它的好理由,特别是它比onload更长/更慢。

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

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

我能找到这篇文章,这是我提出的最适合的文章之一:

http://perfectionkills.com/onloadfunction-considered-harmful/

它声明ECMA-262 5th edition的严格模式(“use strict”; 我不打算在我的项目中使用它)最终会导致某些浏览器与onload不兼容(ReferenceError)在Firefox和Opera中。

所以问题是:除了“use strict”之外,使用直接onload赋值是否有任何真正的缺点?一?我需要的信息不是一些无法解释的意见。

由于

注意:我在问这个问题之前做了搜索(我知道这看起来有点经典),我能找到的最接近的问题是 window.onload vs< body onload =“ “> window.onload的其他替代方案等。

编辑:我创建了此测试用例onload vs window.onload,这证明了onload的速度有多快。我真的会去做这种微观优化,为什么不呢?它们有时很酷。

2 个答案:

答案 0 :(得分:3)

两者都是相同的...当你自己调用onload时,javascript假定它是一个全局属性,它是window对象的属性。所以基本上如果你没有特别说它是window.onload那么javascript引擎会为你做。

if (onload === window.onload) {
   alert("it's the same");  //true
}

因此,只要您不关心严格模式,就不应该对现代浏览器有任何问题。但是,使用完整的window.onload而不仅仅是onload被认为更好。没有输入额外的7个字符,你获得的收益并不高。

答案 1 :(得分:1)

所有全局函数和变量都在window对象中。因此,当您使用onload时,您正在使用window.onload

在命名空间内调用某些内容时,您会有性能成本:它必须获取对象窗口,然后是属性onload。

在没有窗口的情况下调用全局变量时,您可能会在其范围内重新定义:

function () {
  var onLoad = function() {alert("foo")};
  function () {
    onLoad();
  }
}

在此示例中,onload警告“foo”;

所以你问are there any real disadvantages related to using the direct onload assignment

可能会重新定义onload,代码可能无效。