为什么javascript函数调用函数名后不包含'()'?

时间:2013-01-10 03:19:41

标签: javascript javascript-events syntax

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

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

对于id = clickMe的html输入按钮,这是onclick事件的简单事件处理程序。

在第2行中,为什么函数runTheExample的调用不会紧跟()?我认为要调用一个函数,你必须在开/关括号中传递它所需的任何变量/对象,如果函数不期望任何东西,你仍然必须包括像runTheExample()那样的开括号和右括号。

7 个答案:

答案 0 :(得分: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的。通过引用传递函数有多种语言版本。

答案 1 :(得分:5)

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

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

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

无论你使用什么方法,runTheExample都会包含对函数的引用(存在一些差异,比如在赋值之前函数引用不可用,但这是一个不同的故事)。

答案 2 :(得分:3)

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

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

因此,当引用函数名而没有()时,它引用了函数对象,当你添加()时,它是对函数的调用,函数执行。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

因为它会将runTheExample绑定到onclick事件 当您添加()时,它会触发该功能。