javascript函数之间的差异

javascript函数之间的差异,javascript,html,Javascript,Html,我知道这个问题可能很傻,我只是想知道,我不确定这个话题是否符合我目前的提问。但还是想问一下 <button id="Clk">Click on me</button> document.getElementById("Clk").onclick = function(){alert("firedme!")} document.getElementById("Clk").onclick = fire(); function fire(){aler

我知道这个问题可能很傻,我只是想知道,我不确定这个话题是否符合我目前的提问。但还是想问一下

  <button id="Clk">Click on me</button>

   document.getElementById("Clk").onclick = function(){alert("firedme!")}

   document.getElementById("Clk").onclick = fire();

   function fire(){alert("I am fired!")}
点击我
document.getElementById(“Clk”).onclick=function(){alert(“firedme!”)}
document.getElementById(“Clk”).onclick=fire();
函数fire(){alert(“我被解雇了!”)}
我看到第一个“函数”不是在页面加载或刷新时触发的,而是在第二个fire()被触发时触发的

当页面加载后,此函数不会在单击时触发。我很困惑,只是需要澄清一下

您需要将
fire
传递给
onclick
作为函数引用,而不是调用

 document.getElementById("Clk").onclick = fire;
当您将
fire()
传递给onclick处理程序时,它会立即触发,函数的返回也是您正在设置的onclick。通过向函数传递引用,它将停止函数运行,直到触发事件为止。它本质上与上面的匿名函数处理程序相同


rlemon非常友好,为您做了一个很好的演示第二个演示立即启动,因为您使用了括号
()
。将事件处理程序分配给现有函数时,不要包含括号

发生的情况是函数立即执行,返回值被指定为事件处理程序

举例来说,这与执行以下操作相同:

var result = fire();
console.log( result ); // undefined

document.getElementById("Clk").onclick = result;

如您所见,
未定义的
作为事件处理程序传递。

此外,我还想添加一些内容

首先,将
onclick
视为对象的普通属性

因此,
object.onclick=value
其中
value=functionName()
是 很好,例如,
functionName()
可能会返回一个值 使用
返回某物

但是,
onclick
不是一个普通属性。当JS引擎在浏览器中运行时 遇到对基于事件的属性的分配(例如,
onclick
ondblick
onmouseover
等),它会为每个属性创建一个堆栈 元素,由映射b/w组成 onSomeEvent和处理程序

处理程序是一个函数对象。但是如果你做了这样的事情
element.onSomeEvent=functionName()您只需调用
函数
functionName()
如果
functionName()
被定义为

function functionName() {return function(){/*do something*/};}
但是因为在您的例子中,
functionName
没有返回函数,所以您会看到一个意外的结果。这是少校 JavaScript等语言的缺点。在强类型语言中 抛出一个错误。。。因为

class Element {
    Function onclick = null;
    Function ondblclick = null;
    /*other code*/
}
document.getElementById('idName').onclick = new Function(); // correct
document.getElementById('idName').onclick = function(){}; // correct
document.getElementById('idName').onclick = functionName();
/*
 * correct if functionName defined as 
 * Function functionName() {return new Function();} or
 * Function functionName() {return function(){};}
 * and incorrect for any other case
 */

您没有执行第一个,那么为什么要用这些
()
执行第二个呢?删除它们就可以了。应该注意的是,第二个(或N个赋值)覆盖了以前的侦听器(正如您所描述的,它是一个属性)。使用.addEventListener可以将多个侦听器堆叠到一个元素中。