我发现这个浏览:
What is the difference between a function call and function reference?
在那里阅读答案后,我不理解函数引用和函数调用的定义和用法。然后我搜索了很多,但目前还不清楚在哪里使用它。
您可以通过指出概念和用法的不同来帮助我理解这一点吗?我想把它作为未来程序员的参考。
答案 0 :(得分:8)
以此为例:
function foo() {
alert('foo');
return 'bar';
}
首先,什么是功能?这是一个可以调用(或“调用”或“执行”)的例程,当你这样做时,通常做某事,返回一些值
所以你有一个名为foo
的函数。您可以在名称后添加()
来调用它:
foo();
如果将调用的结果分配给变量,则可以将返回值存储在变量中:
var something = foo();
something === 'bar'; // true
但是,这不是你用JavaScript中的函数所能做的全部。它是一种语言,其中函数是一等公民,因此它们可以传递给其他函数,并从其他函数返回。它们也可以存储为变量。例如:
var refToFoo = foo;
现在refToFoo
与foo
相同。它不是副本,它是指向与foo
相同(内部)函数对象的引用。因此,您可以使用refToFoo
,就像使用foo
:
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
我希望这有助于澄清你的疑问。