函数调用和函数引用有什么区别?

时间:2013-04-08 18:26:46

标签: javascript function reference call

我有以下功能

function hello() {
 alert("hi!");
}

拿这段代码:

var elem = document.getElementById("btn");
elem.onclick = hello;

我的问题可能有点难以理解,所以请耐心等待: 这段代码与普通调用有什么区别,或者是什么使得这段代码需要引用函数变量而不是常规调用? (hello();

我怎么知道我应该在哪里提供函数的引用,以及什么时候我应该实际调用它?

6 个答案:

答案 0 :(得分:29)

嗯,onclick属性需要对函数的引用,以便在单击元素时执行。通常它是:

element.onclick = funcRef;

element.onclick = function () {
    funcRef();
};

(但当然,最好使用addEventListenerattachEvent

注意它们是如何引用函数而不是调用。

当某些内容需要引用时,您不会调用它...您为其指定引用(第一个示例)。

如果要专门调用某个函数,可以使用()调用它(第二个示例)。但请注意,在第二个示例中,仍然存在对分配给onclick的函数的引用 - 它只是一个匿名函数。

可能是更重要的部分:

有些人认为你想这样做:

element.onclick = funcRef();

但是立即执行该函数(因为()),并将其返回值赋给onclick。除非返回值 是一个函数,否则这不是你想要的。

我认为这个故事的寓意是,当你想要/现在需要执行某些东西时,你可以调用该函数。如果需要该函数供以后使用或需要存储,则不要调用它。

答案 1 :(得分:18)

你想要它现在执行吗?然后打电话给它。

a=hello()表示“尽快致电hello(),并将其返回值设为a”。

另一方面,a=hello表示“ahello的别名。如果您致电a(),则会获得与调用hello()相同的结果}“

您将后者用于回调等,您希望告诉浏览器在事件发生后您想要发生什么。例如,您可能希望在用户点击时“拨打hello()”(如示例中所示)。或者,“当AJAX查询返回结果时,在返回的数据上调用callback()函数”。

答案 2 :(得分:12)

  

我怎么知道我应该在哪里提供这个功能的参考,以及我什么时候应该实际调用它?

您是否需要立即运行此功能?

然后添加()来执行它

您是否需要将函数引用以便稍后调用?

不要添加()。

答案 3 :(得分:2)

JavaScript中的几乎所有语句都有返回值。除非另有说明,否则JavaScript中的函数将在调用时返回undefined。所以,如果要返回一个函数,在这个赋值语句中调用函数是唯一有意义的上下文:

function hello() {
    return function() {
        alert("hi!");
    }
}

elem.onclick = hello();

答案 4 :(得分:1)

无论如何调用,都需要某处对您的函数的引用。这里的区别在于您没有明确调用hello函数。您正在将该函数的引用分配给elem DOM节点的onclick事件处理程序,以便在为该节点触发onclick时,将调用您的函数。

答案 5 :(得分:1)

hello()表示您调用该函数,这意味着该函数将直接执行。

当你有elem.onclick = hello时,这称为回调。 hello不是直接执行的,而是仅在某个事件被触发时(在这种情况下单击元素时)