2014-06-06 106 views
7

我知道这个问题可能很愚蠢只是想知道,而且我不确定该主题是否与我目前的问题匹配。但还是想问一下。javascript函数之间的差异

<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!")} 

我看到的第一个“功能”,则不会触发页面加载或刷新,但这里作为第二个火()被触发
时加载页面,后来这个功能没有得到上点击触发。我很困惑,只需要澄清一下。

+1

您还没有执行的第一个,那么你为什么要执行这些'()'第二个?删除它们,你很好。 –

回答

7

立即使用,因为你用括号()第二个火灾。将事件处理程序分配给现有函数时,请不要包含括号。

该函数会立即执行,并将返回值指定为事件处理函数。

为了说明,这是一样的做:

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

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

正如你所看到的,undefined作为事件处理程序通过。

13

您需要将fire更改为onclick作为函数引用,而不是调用。

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

当您通过fire()到onclick处理程序,它会立即触发,并从函数的返回是你所设定的onclick了。通过传递对该函数的引用,它将阻止它运行,直到事件被触发。它基本上与上面的匿名函数处理程序相同。

rlemon是那种足以让你一个很好的示范fiddle < - 在这里

3

另外,我想补充几件事情。

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

所以,object.onclick = value其中value = functionName()是 完全没有问题,例如,functionName()可以使用返回return something;

onclick值 不是一般的财产。当JS引擎在浏览器 遇到分配到基于事件的性质(例如onclickondblclickonmouseover等),它创建用于每个 元件的堆叠,由映射的黑/白 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 
*/ 
+2

应该注意第二个(或N个任务)重写先前的侦听器(正如你所描述的那样是一个属性)。使用.addEventListener允许您将多个侦听器堆叠到一个元素。 – rlemon