警报("嗨!")和功能()之间的区别{alert("嗨!")}

Yog*_*ogi 24 javascript dom

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

<button id="myButton" onclick="alert('Hi!')"> 
Run Code Online (Sandbox Code Playgroud)

为什么

document.getElementById("myButton").onclick = alert('Hi!') 
Run Code Online (Sandbox Code Playgroud)

不起作用,但在页面加载时发出警报?我无法理解function()添加到它和没有它是如何工作的function().我希望你们理解我的问题.我在这里遗漏了一些东西.

gur*_*372 31

document.getElementById("myButton").onclick = alert('Hi!')
Run Code Online (Sandbox Code Playgroud)

是错误的,因为onclick应该分配给函数引用,而不是函数调用结果本身.

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

为此,它应该是:

document.getElementById("myButton").onclick = function(){alert('Hi!')};
Run Code Online (Sandbox Code Playgroud)

此外,除非它包含在window.onload事件中,否则这将无效:

window.onload = function(){
    document.getElementById("myButton").onclick = function(){alert('Hi!')};
};
Run Code Online (Sandbox Code Playgroud)

  • @ 3yK只有在按钮点击时才会在页面加载时抛出错误.因为当按钮点击发生时,只有函数调用onclick()将被转换为`(alert("hi'))()`.在页面加载时它将简单地执行alert(Hi). (3认同)
  • @Apolo我仍然会把它保存在`window.onload`中有两个原因1)所以我的代码并不太依赖它在页面上的位置2)你不必担心你的同事复制这段代码(这是在这个位置工作)到其他地方然后抱怨你的代码没有工作.几乎所有我们遵循最佳实践的原因:) (2认同)

Ami*_*ich 10

alert('Hi!')是一个函数调用,它提醒'Hi'并且不返回任何内容(undefined).

onclick期望得到一个函数,你传递的是函数调用的结果undefined.

由于JavaScript不是强类型框架,因此不会在错误的分配上出错.

那么为什么以下工作:

<button id = "myButton" onclick="alert('Hi!')">
Run Code Online (Sandbox Code Playgroud)

这是因为html解析器(在这种情况下,你的浏览器)在幕后做了一些工作并用函数包装调用.

  • 不确定角度参考在这里是如何相关的. (2认同)
  • 鉴于OP不知道角度及其工作原理,我认为这没有任何帮助. (2认同)

Cha*_*lie 7

document.getElementById("myButton").onclick 期望稍后调用函数.

<button id = "myButton "onclick="alert('Hi!')"> 期望稍后执行一段代码.


mad*_*nce 6

alert('Hi') 
Run Code Online (Sandbox Code Playgroud)

这里alert是一个由浏览器调用的内置函数,它打开一个警告框.

function callAlert(){
  alert('Hi');
}
Run Code Online (Sandbox Code Playgroud)

这里callAlert是一个自定义函数,它调用内置函数警报

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

document.getElementById("myButton").onclick = alert('Hi!') //alert is 
Run Code Online (Sandbox Code Playgroud)

已经执行了

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


eku*_*ela 5

有关内联版本工作原理的说明,请参阅此文章.

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