1
window.onload = function() {
  document.getElementById('clickMe').onclick = runTheExample;
}

function runTheExample() {
  alert('running the example');
}

这是一个简单的事件处理程序,用于onclickid = clickMe 的 html 输入按钮的事件。

在第 2 行中,为什么对函数的调用runTheExample没有紧跟在后面()?我认为要调用一个函数,你必须在一个开/关括号中传递它期望的任何变量/对象,如果函数不期望任何东西,你仍然必须包括开闭括号,如runTheExample().

4

7 回答 7

6
document.getElementById('clickMe').onclick = runTheExample;

此处的目的不是调用runTheExample(),而是将对函数 runTheExample 的引用分配给onclick事件。

在内部,当onclick事件被触发时,Javascript 能够通过您在上面的代码中提供的引用调用函数runTheExample 。

片段

var myFunction = function() { return 42; };

// Assigning the reference
myObject.callback = myFunction;

myObject.callback(); // Has the same effect as calling myFunction();

// Assigning by calling the function
myObject.callback = myFunction();

myObject.callback;   // Returns 42
myObject.callback(); // Exception! Cannot call "42();"

这不是特定于 Javascript 的。通过引用传递函数有多种语言版本。

于 2013-01-10T03:23:07.557 回答
5

您仅使用括号来调用(调用)函数。当您将其分配给 时onclick,您只是通过引用传递它。

为了更好地理解这一点,请考虑另一种声明函数的方法:

var runTheExample = function () {
  alert('running the example');
}

无论您使用哪种方法,runTheExample都将包含对该函数的引用(存在一些差异,例如函数引用在分配之前不可用,但这是另一回事)。

于 2013-01-10T03:21:40.207 回答
3

它不是调用它,而是设置属性onclick。当调用 时onclick(),它将运行您定义的函数。但是请注意, 的上下文this将是调用它的对象 ( document.getElementById('clickMe'))。

于 2013-01-10T03:22:22.737 回答
3

函数是javascript中的对象。该行将 click me 元素的 onclick 属性设置为 runTheExample 函数,它不会立即调用该函数。

var a =runTheExample; //sets a to runTheExample
a(); //runs the runTheExample function

因此,当引用函数名而不带 () 时,它指的是函数对象,当您添加 () 时,它是对函数的调用,并且函数执行。

于 2013-01-10T03:23:00.397 回答
2

在这种情况下,runTheExample 函数被视为变量并分配给 onclick 事件处理程序。在函数名之后使用 () 来调用函数。如果您在此处添加它们,将会发生的情况是 runTheExample() 将在加载期间调用一次,显示警报,然后将 null 值分配给 onclick 处理程序。

于 2013-01-10T03:22:15.840 回答
2

您没有在这里调用该函数。您将函数设置为事件处理程序,并且在触发事件之前不会实际调用该函数。你写的引用了这个函数;这与实际调用它是一个不同的概念。

于 2013-01-10T03:22:22.470 回答
1

因为它绑定runTheExampleonclick事件。
添加()时会触发该功能。

于 2013-01-10T03:21:54.393 回答