Javascript 有人能帮我理解下面的代码块吗?

Javascript 有人能帮我理解下面的代码块吗?,javascript,Javascript,下面的代码块让我有点困惑。我会在每一行旁边评论我认为它的意思。如果有人能帮我澄清任何误解,或者确认我实际上是在正确地解释它,我将非常感激 以下是上下文中的代码: 我首先不明白的是window.onload旁边的感叹号 if(!window.onload) 为什么我需要指定窗口是否尚未加载?我不是只想将onLoad()函数附加到onLoad事件,以便在完成时触发它吗?用这样的话说: window.onload = onLoad(); 为什么需要额外的步骤?为什么使用if/else语句 其次,

下面的代码块让我有点困惑。我会在每一行旁边评论我认为它的意思。如果有人能帮我澄清任何误解,或者确认我实际上是在正确地解释它,我将非常感激

以下是上下文中的代码:

我首先不明白的是window.onload旁边的感叹号

if(!window.onload)
为什么我需要指定窗口是否尚未加载?我不是只想将onLoad()函数附加到onLoad事件,以便在完成时触发它吗?用这样的话说:

window.onload = onLoad();
为什么需要额外的步骤?为什么使用if/else语句


其次,为什么在代码块的后半部分中,我只需要重新加载页面就可以重新附加onLoad()函数?这让我想起了我刚才问的问题。为什么要比简单地写下更复杂:

window.onload = onLoad();
当然,当我将代码更改为一个简单的语句时,就像上面的语句一样,它实际上不起作用。但是,我仍然不完全理解所讨论的代码块的每个部分的必要性。
如果有人能详细地告诉我这一点,那将非常有帮助

编辑:
多亏了下面的人的帮助,我用一条简单的语句替换了所有这些代码:

window.addEventListener('load', onLoad);

是一个布尔反转:if not window.onload为null或未定义,或者用更简单的英语,如果名为
window
的对象中名为
onload
的变量不是null或未定义

逻辑基本上是说,如果没有onload功能,就安装我的。如果有一个onload函数,安装一个新的包装器函数,该函数调用现有函数,然后调用我的函数

所有代码都不会“重新加载”页面。将onload处理程序的分配与加载页面混淆

该函数所做的是通过将添加的函数链接到原始窗口对象,将onload功能添加到可能已经具有onload功能的窗口对象,但仅在必要时

在今天的世界中,这都是多余的,因为您可以将事件侦听器添加到要为onload事件执行的函数列表中

if (!window.onload) 
这是检查
window.onload
是否为null或未定义。如果已在别处定义了
window.onload
,则可能不希望将其替换为
onload()
函数


您的代码块基本上检查
window.onload
是否在其他地方定义。如果不是,则将
onLoad()
分配给
window.onLoad
。如果是,请执行现有的
窗口.onload
,然后调用
onload()
函数。

FYI,没有理由在现代浏览器中使用这种复杂的附加onload处理程序的方法。只需使用
窗口。addEventListener(“load”,fn)
将用更简单的代码完全取代现代浏览器中的这一点。我知道@JFriend00这看起来太复杂了,所以第一部分只是检查窗口对象中是否存在onload变量,而不是检查窗口是否已加载。如果确实存在,则为其分配onLoad()函数。如果它不存在,则创建一个并为其分配onLoad()函数。我对你的答案解释正确吗?尽管如此,有一件事我似乎是对的:这段代码比它需要的要复杂得多@软件Monkey@MddHtt13:第一句是正确的,但后面的不是;它检查窗口对象中是否已经定义了onload处理程序;如果不是,则分配所需的处理程序,如果是,则通过分配一个调用原始处理程序的包装函数,然后是新处理程序,将新处理程序链接到现有处理程序。
if (!window.onload)