理解javascript函数调用和引用

时间:2013-11-01 17:44:41

标签: javascript function

我发现这个浏览:

What is the difference between a function call and function reference?

在那里阅读答案后,我不理解函数引用和函数调用的定义和用法。然后我搜索了很多,但目前还不清楚在哪里使用它。

您可以通过指出概念和用法的不同来帮助我理解这一点吗?我想把它作为未来程序员的参考。

1 个答案:

答案 0 :(得分:8)

以此为例:

function foo() {
    alert('foo');
    return 'bar';
}

首先,什么是功能?这是一个可以调用(或“调用”或“执行”)的例程,当你这样做时,通常做某事返回一些值

所以你有一个名为foo的函数。您可以在名称后添加()来调用它:

foo();

如果将调用的结果分配给变量,则可以将返回值存储在变量中:

var something = foo();
something === 'bar'; // true

但是,这不是你用JavaScript中的函数所能做的全部。它是一种语言,其中函数是一等公民,因此它们可以传递给其他函数,并从其他函数返回。它们也可以存储为变量。例如:

var refToFoo = foo;

现在refToFoofoo相同。它不是副本,它是指向与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

我希望这有助于澄清你的疑问。