提问者:小点点

函数调用和函数引用之间的区别是什么?


我有以下功能

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

下面是这段代码:

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

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

我如何知道应该在哪里给函数一个引用,以及应该在什么时候真正调用它?


共3个答案

匿名用户

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

element.onclick = funcRef;

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

(当然,最好使用AddEventListenerAttachEvent)

请注意,它们都是对函数的引用,而不是调用。

当某事需要一个引用时,你不调用它。。。你给它分配一个引用(第一个例子)。

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

可能更重要的部分是:

有些人认为你想这样做:

element.onclick = funcRef();

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

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

匿名用户

你想让它现在执行吗? 那就叫它。

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

另一方面,a=hello意味着“ahello的别名。如果您调用a(),您将得到与调用hello()相同的结果。”

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

匿名用户

我如何知道应该在哪里给函数一个引用,以及应该在什么时候真正调用它?

现在需要运行函数吗?

而不是添加()来执行它

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

不要添加()。