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可以将多个侦听器堆叠到一个元素中。