以此为例:
function foo() {
alert('foo');
return 'bar';
}
首先,什么是函数?这是一个可以调用(或“调用”或“执行”)的例程,当你这样做时,它通常做某事,并且返回一些值.
所以你有一个名为foo 的函数。您可以通过在其名称后添加() 来调用它:
foo();
如果将调用结果分配给变量,则可以将返回值存储在变量中:
var something = foo();
something === 'bar'; // true
但这并不是 JavaScript 函数所能做的全部。它是一种语言,其中函数是一等公民,因此它们可以传递给其他函数,并从其他函数返回。它们也可以存储为变量。例如:
var refToFoo = foo;
现在refToFoo 与foo 相同。它不是一个副本,它是一个引用,它指向与foo 相同的(内部)函数对象。所以你可以像使用foo一样使用refToFoo:
var something = refToFoo();
something === 'bar'; // true
refToFoo === foo; // true; they're the same object
也许函数引用最常见的用途是将它们用作事件侦听器:
someElement.onclick = foo;
注意上面没有括号。如果我们使用括号,foo 将立即被调用,其返回值将分配给元素的 onclick 方法。由于该函数返回一个字符串,因此如果单击该元素不会发生任何事情。这是新手常犯的错误。另一个常见的方法是调用函数而不是传递对 setTimeout 的引用:
setTimeout(foo(), 1000); // WRONG - foo is executed immediately
比较一下:
setTimeout(foo, 1000); // RIGHT - we're passing a reference to the function,
// that will be invoked by the js engine after 1000ms
我希望这有助于澄清您的疑问。