当前位置: 首页 > 知识库问答 >
问题:

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

彭霄
2023-03-14

我有以下功能

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

下面是这段代码:

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

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

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

共有3个答案

吴鸿彩
2023-03-14

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

现在需要运行函数吗?

而不是添加()来执行

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

不要添加()。

韩嘉祯
2023-03-14

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

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

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

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

锺离俊雄
2023-03-14

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

element.onclick = funcRef;

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

(当然,最好使用AddEventListenerAttachEvent)

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

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

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

可能更重要的部分是:

有些人认为你想这样做:

element.onclick = funcRef();

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

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

 类似资料:
  • 问题内容: 我有以下功能 这段代码: 我的问题可能有点难以理解,所以请忍受:是什么使该代码段与常规调用完全区分开,或者是什么使该代码段需要引用函数变量而不是常规调用?() 我怎么知道应该在哪里引用该函数,以及什么时候该真正调用它? 问题答案: 好吧,该属性期望对函数的引用,以便在单击元素时执行该函数。通常是: 要么 (但是,当然,最好使用和) 请注意,它们都是如何引用函数而不是调用。 当某些东西需

  • 我正在使用静态编程语言反应器(Mono和Flux),我想知道使用(来自kotlin-coroutines-reactive)函数和(来自React)之间的区别。我带来了两个例子来展示我正在努力做的事情。 示例1(具有等待功能): 输出:带有IllegalStateException堆栈跟踪的“错误”。 示例2(具有订阅功能): 输出:只是“错误”。 为什么示例1显示堆栈跟踪而示例2不显示? 谢谢

  • 问题内容: 我一直在阅读iBooks中的快速编程指南。有人可以向我解释函数和闭包之间的区别是什么。只是它没有名称并且可以在表达式中使用? 问题答案: 函数实际上只是命名为闭包。以下至少在概念上是等效的: 在使用声明方法的情况下,这变得有些复杂,例如,关于自动插入公共命名参数等,添加了一些有趣的糖,例如,变为`func myMethod(foo:Int, #bar:Int, 但是,即使方法只是闭包的

  • 问题内容: OpenAI的强化学习的REINFORCE和actor-critic示例具有以下代码: 加强: 演员评论家: 一种正在使用,另一种正在使用。 据我所知,文档没有对它们之间进行任何明确的区分。 我很高兴知道这些功能之间的区别。 问题答案: 沿着 新的维度 连接张量序列。 在给 定维度上 连接给定序列张量的序列。 因此,如果和具有形状(3,4),则将具有形状(6,4),并将具有形状(2,3

  • 我在网上阅读,找到了引用数组存储引用。如果我没有弄错的话,数组将存储变量的内存地址。如果这就是为什么我在循环字符串数组时看不到内存地址的原因,如下所示。 现在根据定义,arrNames数组将在arrNames[0]、arrNames[1]、arrNames[2]存储引用。这意味着内存地址将指向名字,如eJohn,Max和Alex。 如果它是基元数组,它将直接存储如下所示的值。 Num[0]将直接保

  • 本文向大家介绍SCALAR和COLUMN函数之间的区别,包括了SCALAR和COLUMN函数之间的区别的使用技巧和注意事项,需要的朋友参考一下 DB2 SCALAR函数采用单个列值并返回单个结果。COLUMN函数从DB2表的多行中获取列值,并返回单个结果。对于SCALAR函数,仅涉及一行。 SCALAR 函数 描述 LENGTH 给出列值的长度 REPLACE 用于用另一个字符串替换一个字符串 C

  • 本文向大家介绍虚函数与纯虚函数之间的区别,包括了虚函数与纯虚函数之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解虚拟和纯虚拟功能之间的区别。 虚函数 它在类中有自己的定义。 基类可以覆盖虚拟函数。 它没有派生类。 声明 纯虚函数 没有定义。 如果一个类至少具有一个虚函数,则可以将其声明为抽象。 派生类必须重写纯虚函数才能使用它。 通过在声明中放置“ = 0”来指定纯虚函数

  • 本文向大家介绍Lua中使用.和:调用函数的区别,包括了Lua中使用.和:调用函数的区别的使用技巧和注意事项,需要的朋友参考一下 tb.print和tb:print的含义略微不同,:调用函数会多传递进去一个self进去,差不多相当于OOP里面的成员函数调用. 但是和OOP里面成员函数/非成员函数不同的是,lua里面的非成员函数.调用,他不是静态的. tb对象有一个print function成员,当