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

What is the difference between a function call and function reference?

提问人:frrlod 提问时间:4/9/2013 最后编辑:Defaultfrrlod 更新时间:4/9/2013 访问量:17609

问:

我有以下功能

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

以这段代码为例:

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

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

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

JavaScript 函数 参考 调用

评论

0赞 SGM1 4/9/2013
我可能是错的,这些动态语言的新手(刚刚开始研究 python),但我认为引用是当您想为所述函数创建别名时,而调用实际上是您想要调用的时候。(例如。 那么就叫到哪里叫var = hellovar()hello()var()
0赞 Sebastian Simon 11/24/2021
相关:在 JavaScript 中,如果我调用带有括号的函数会有所不同吗?

答:

52赞 Ian 4/9/2013 #1

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

element.onclick = funcRef;

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

(但当然,最好使用addEventListenerattachEvent)

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

当某物需要引用时,你不会称它为......您为其分配一个引用(第一个示例)。

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

可能更重要的部分:

有些人认为你想这样做:

element.onclick = funcRef();

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

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

评论

10赞 Wex 4/9/2013
即时执行位非常重要。
0赞 Ian 4/9/2013
@Wex 哈哈,是的,我似乎破坏了它。试图思考如何进一步扩展它
0赞 John Dvorak 4/9/2013
有一个有趣的极端情况:element.onclick = getClickHandler()
0赞 Ian 4/9/2013
@JanDvorak 这可能不是太明显,但我包括了“除非返回值是一个函数,否则这不是你想要的。我不想太深入,以防它混淆 OP
19赞 epascarello 4/9/2013 #2

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

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

比添加 () 来执行它

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

不要添加 ()。

2赞 Default 4/9/2013 #3

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

2赞 wmfairuz 4/9/2013 #4

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

而当您有 elem.onclick = hello 时,这称为回调。hello 不会直接执行,而仅在触发特定事件时执行(在本例中,当单击元素时)

30赞 Manishearth 4/9/2013 #5

你希望它现在执行吗?然后调用它。

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

另一方面,表示 “ 是 的别名。如果调用 ,则得到与调用相同的结果a=helloahelloa()hello()"

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

3赞 Wex 4/9/2013 #6

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

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

elem.onclick = hello();