Javascript 警报(";Hi!";)和函数({alert(";Hi!";)}之间的区别

Javascript 警报(";Hi!";)和函数({alert(";Hi!";)}之间的区别,javascript,dom,Javascript,Dom,当我们在按钮中执行内联命令时: <button id="myButton" onclick="alert('Hi!')"> 不工作,但在加载页面时发出警报?我无法理解它在添加了function()和没有function()的情况下是如何工作的。我希望你们能理解我的问题。我在这里遗漏了一些东西 document.getElementById("myButton").onclick = alert('Hi!') 错误,因为onclick应该分配给函数引用,而不是函数调用结果本身 加

当我们在按钮中执行内联命令时:

<button id="myButton" onclick="alert('Hi!')"> 
不工作,但在加载页面时发出警报?我无法理解它在添加了
function()
和没有
function()
的情况下是如何工作的。我希望你们能理解我的问题。我在这里遗漏了一些东西

document.getElementById("myButton").onclick = alert('Hi!')
错误,因为onclick应该分配给函数引用,而不是函数调用结果本身

加载页面时,它将执行
alert('Hi!')
,但这不是本文的目的,是吗?分配onclick处理程序的目的是确保在单击按钮时执行此警报

要做到这一点,应该:

document.getElementById("myButton").onclick = function(){alert('Hi!')};
此外,除非将其包装在
窗口中,否则此操作将不起作用。onload
事件:

window.onload = function(){
    document.getElementById("myButton").onclick = function(){alert('Hi!')};
};


简而言之,浏览器不仅仅将
alert('Hi!')
分配给
onclick
,而是将其包装在一个函数中。

document.getElementById(“myButton”)。onclick
希望以后调用一个函数

alert('Hi') 
希望稍后执行一段代码

alert('Hi!')
是一个函数调用,它向'Hi'发出警报,但不返回任何内容(
未定义的

onclick
期望得到一个函数,您正在传递函数调用的结果,该结果是
未定义的

由于
JavaScript
不是一个强类型的框架,所以在错误的赋值上不会出现错误

那么,为什么以下方法会起作用:

<button id = "myButton" onclick="alert('Hi!')">

这是因为html解析器(在本例中是您的浏览器)在幕后做了一些工作,并使用函数包装调用

alert('Hi') 
在这里,警报是浏览器调用的一个内置函数,它打开一个警报框

function callAlert(){
  alert('Hi');
}
这里的callAlert是一个自定义函数,它调用内置函数alert

在您的示例中,在附加单击事件时,必须定义函数

document.getElementById("myButton").onclick = alert('Hi!') //alert is 
已经执行

document.getElementById("myButton").onclick = function (){ alert('Hi!') }; 
//a function is defined/declared which will be executed when the onclick action is performed

一个立即执行,然后给出结果;另一个创建一个函数,当调用该函数时,该函数将执行该行为,并返回该函数(而不是函数体的执行)。document.getElementById(“myButton”).onclick=alert('Hi!'),如果这需要函数引用,为什么它不抛出错误,而只是在加载页面时发出警报。@3yK它不会在页面加载时抛出错误,只会在单击按钮时抛出错误。因为只有当按钮单击时,才会进行函数调用onclick(),该函数将被转换为
(警报(“hi”))()
。在页面加载时,它只会执行警报(hi)@3yK同时检查更新后的答案。@Apolo我仍然会将其保存在
窗口中。onload
有两个原因1)这样我的代码就不会太依赖于它在页面上的位置2)你不必担心同事复制此代码(在这个位置工作)我们遵循最佳实践的原因大致如下:)@3yK特别是,它将运行
alert(“hi”)
,查看返回的内容(它返回
undefined
),并将其存储在onclick处理程序中。当您单击它时,它将调用
undefined()
由于这不是一个有效的函数,它会导致一个错误。不确定角度引用在这里有多重要。@SergioTulentsev-这只是一个示例,说明解析器和框架如何处理html“javascript”“以不同的方式表达。鉴于OP不知道角度以及它是如何工作的,我认为这一点也没有帮助。@SergioTulentsev-OP可以坚持第一种解释。将来可能进入此链接的其他人可能会从后者中受益。