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

IT技术 javascript function reference call
2021-01-10 04:17:46

我有以下功能

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

拿这段代码:

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

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

我怎么知道应该在哪里引用该函数,以及何时应该实际调用它?

6个回答

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

element.onclick = funcRef;

或者

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

(当然,最好使用addEventListenerand attachEvent

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

当某些东西需要引用时,您不会调用它……您为其分配一个引用(第一个示例)。

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

可能是更重要的部分:

有些人认为你想这样做:

element.onclick = funcRef();

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

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

立即执行位是非常重要的。
2021-03-10 04:17:46
有一个有趣的角落案例: element.onclick = getClickHandler()
2021-03-12 04:17:46
@Wex 哈哈是的,我似乎破坏了它。试图思考如何进一步扩展它
2021-03-18 04:17:46
@JanDvorak 这可能不太明显,但我已经包括“除非返回值是一个函数,否则这不是你想要的。” 我不想走得太远,以防它混淆 OP
2021-04-06 04:17:46

你想让它现在执行吗?然后调用它。

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

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

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

我怎么知道应该在哪里引用该函数,以及何时应该实际调用它?

您现在需要运行该函数吗?

比添加 () 来执行它

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

不要添加 ()。

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

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

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

elem.onclick = hello();