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

我有以下function

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

拿这段代码:

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

我的问题可能有点难以理解,所以请耐心等待:这段代码与普通调用完全不同,还是使这段代码需要引用函数variables而不是常规调用? ( hello();

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

那么, onclick属性需要一个函数的引用,在元素被点击时执行。 通常情况下是:

 element.onclick = funcRef; 

要么

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

(但是,当然,最好使用addEventListenerattachEvent

注意他们两个是如何引用的函数,而不是调用。

当某些事情需要引用时,你不要把它称为…你给它指定一个引用(第一个例子)。

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

可能更重要的部分是:

有些人认为你想这样做:

 element.onclick = funcRef(); 

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

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

你想要立即执行吗? 然后调用它。

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

另一方面, a=hello意思是“ ahello的别名,如果你调用a() ,你会得到和调用hello()相同的结果”

您可以使用后者进行callback等,以便在事件发生后告诉浏览器您想要发生的事情。 例如,你可能想要说“当用户点击”(如例子中)时打电话给你()。 或者,“当AJAX查询返回结果时,对返回的数据调用callback()函数”。

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

你需要现在运行的function吗?

比添加()来执行它

你需要被引用的function,所以它被称为以后?

不要添加()。

几乎所有JavaScript语句都有返回值。 除非另行指定,JavaScript中的函数在调用时将返回undefined 。 所以,在这个赋值语句中调用你的函数的唯一的上下文,如果它是返回一个函数:

 function hello() { return function() { alert("hi!"); } } elem.onclick = hello(); 

无论如何调用函数,都需要引用你的函数。 这里的区别是你没有明确地调用hello函数。 您正在将该函数的引用分配给elem DOM节点的onclick事件处理函数,以便在针对该Node启动onclick时调用函数。

hello()意味着你调用该函数,这意味着函数将被直接执行。

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