理解javascript函数调用和引用

理解javascript函数调用和引用,javascript,function,Javascript,Function,我在浏览时发现: 在阅读了那里的答案之后,我不理解函数引用和函数调用的定义和用法。然后我搜索了很多,但仍然不清楚在哪里使用什么 你能通过指出概念和用法的不同来帮助我理解这一点吗?我想将此作为未来编程人员的参考。以此为例: function foo() { alert('foo'); return 'bar'; } var refToFoo = foo; 首先,什么是函数?它是一个可以调用(或“调用”或“执行”)的例程,当您这样做时,它通常会做一些事情,并返回一些值 因此您有

我在浏览时发现:

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

你能通过指出概念和用法的不同来帮助我理解这一点吗?我想将此作为未来编程人员的参考。

以此为例:

function foo() {
    alert('foo');
    return 'bar';
}
var refToFoo = foo;
首先,什么是函数?它是一个可以调用(或“调用”或“执行”)的例程,当您这样做时,它通常会做一些事情,并返回一些值

因此您有一个名为
foo
的函数。您可以通过在其名称后添加
()
来调用它:

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

var something = foo();
something === 'bar'; // true
但这并不是JavaScript中函数的全部功能。它是一种语言,函数是第一类公民,因此它们可以传递给其他函数,并从其他函数返回。它们也可以存储为变量。例如:

function foo() {
    alert('foo');
    return 'bar';
}
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

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

听起来您缺少的是函数是JavaScript中的对象这一事实。函数的引用可以像任何变量一样传递。仅当括号放在它后面时才调用它。