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

frr*_*lod 24 javascript reference function call

我有以下功能

function hello() {
 alert("hi!");
}
Run Code Online (Sandbox Code Playgroud)

拿这段代码:

var elem = document.getElementById("btn");
elem.onclick = hello;
Run Code Online (Sandbox Code Playgroud)

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

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

Ian*_*Ian 31

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

element.onclick = funcRef;
Run Code Online (Sandbox Code Playgroud)

要么

element.onclick = function () {
    funcRef();
};
Run Code Online (Sandbox Code Playgroud)

(但当然,最好使用addEventListenerattachEvent)

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

当某些东西需要引用时,你不要调用它...你给它一个引用(第一个例子).

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

可能更重要的部分:

有些人认为你想这样做:

element.onclick = funcRef();
Run Code Online (Sandbox Code Playgroud)

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

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

  • **立即执行**位非常重要. (4认同)
  • @frrlod当然可以!http://stackoverflow.com/questions/6348494/addeventlistener-vs-onclick (2认同)

Man*_*rth 18

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

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

另一方面,a=hello意思是" a是别名hello.如果你打电话a(),你会得到与调用相同的结果hello()"

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


epa*_*llo 12

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

你现在需要这个功能吗?

然后添加()来执行它

你需要引用函数,以便稍后调用吗?

不要添加().