什么是 Javascript 中的回调?[复制]

What is a callback in Javascript? [duplicate]

提问人:whoam_i24 提问时间:5/16/2023 最后编辑:whoam_i24 更新时间:5/16/2023 访问量:107

问:

MDN 表示,回调是一个作为参数传递给另一个函数的函数。据我了解,这意味着回调包含在括号中。这是链接。

但是,我曾经在 Freecodecamp 上看到一篇文章,说回调是 MDN 类似描述的函数,而回调函数是包含在另一个功能块中的函数。这意味着回调函数充当子函数。

是我错了,还是这两个来源之间有一些混淆?

JavaScript 函数 回调

评论

1赞 Jenson M John 5/16/2023
请参考 : w3schools.com/js/js_callback.asp
0赞 Andy 5/16/2023
如果你指的是“回调”和“回调函数”之间的区别,那就没有了——这两个术语是同义词。
0赞 gre_gor 5/16/2023
“而回调函数是包含在另一个功能块中的函数。”那篇文章到底在哪里说的?
0赞 whoam_i24 5/16/2023
@gre_gor我问:“我错了吗?感谢您的帮助。

答:

0赞 Alexander Nenashev 5/16/2023 #1

回调是作为参数传递给另一个函数的任何函数,旨在回,在接收器函数内的某个位置调用。其余的就不那么重要了。您可以将函数分配给变量并将变量作为回调传递,因为在 JS 函数中是第一类对象,即类/函数的实例。Function

-1赞 Asleepace 5/16/2023 #2

在另一个函数的作用域内定义的函数称为闭包

function outer() {
   let str1 = "Hello, "
   return function inner() {
       return str1 + "world!"
   }
}

console.log(outer()())

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

作为参数传递给另一个函数的函数称为回调

https://developer.mozilla.org/en-US/docs/Glossary/Callback_function

function one() {
   return " world!"
}

function two(callback) {
    return "hello" + callback()
}

console.log(two(one))

更新

不要太担心术语,这里的关键要点应该是

  • 函数是 Javascript 中的第一类对象(了解更多)
  • 周围范围和闭包的工作原理

评论

0赞 whoam_i24 5/16/2023
所以我提供的第二个网站有点不对劲?
0赞 Asleepace 5/16/2023
@Satrio_Dh TBH 不太担心它们的名称,但关键的要点应该是可以传递函数并将其分配给变量。还有周围范围在闭包中的工作方式。好问题!
0赞 Asleepace 5/16/2023
lmao 没有它就不会是堆栈溢出 XD
0赞 RAllen 5/16/2023 #3

这个词的意思是某个函数将在某个时间点被某些代码回调。这个词没有指定或表示如何定义回调函数的方式。callbackcallback

通常,回调是作为参数传递给另一个函数的函数。回调函数的主体可以驻留在全局作用域中,也可以驻留在其他函数或类方法中。

例如:

const callback = () => console.log('Hello, world');
setTimeout(callback, 1000);

在这种情况下,回调的主体在全局空间中定义,并作为参数传递给 。setTimeout

第二种选择:

const startMyTimer = () => {
  const callback = () => console.log('Hello, world');
  setTimeout(callback, 1000);
};

在这种情况下,回调在另一个函数的主体中定义,并作为参数传递给 。startMyTimersetTimeout

第三种选择:

const startMyTimer = () => {
  setTimeout(() => console.log('Hello, world'), 1000);
};

在这里,回调的主体在函数调用中声明,并作为参数传递到函数调用中。setTimeout

数组示例:

const callbacks = [
  () => console.log('hello'),
  () => console.log('world'),
];

callbacks.forEach((cb) => cb());

此示例演示回调不一定需要作为参数传递,也可以存储在变量或数组中。

保存的回调场景,基于 @slebetman 的评论:

class MyObject {
    constructor() {
        this.callback = null;
    }
    runIt() {
        // do some work here
        // ...
        // and then call the callback
        this.callback();
    }
}

const obj = new MyObject();
obj.callback = () => console.log('Hello, world!');
obj.runIt();

这表明回调可以保存为对象的字段,然后在完成一些工作后执行。

如果有帮助,请告诉我。

评论

1赞 slebetman 5/16/2023
此外,回调可以分配给属性或附加为事件处理程序。尽管大多数 API 都是这样编写的,但它们没有必要作为参数传递。例如,您可以有一个对象并分配一个回调:,当您执行以下操作时,该函数将调用该函数: 。这种回调在 Java 和 C++ 等语言中更常见,但它也是一种回调,你也会在一些 javascript 代码中看到它。pdfCompilerpdfCompiler.afterCompile = (x) => {console.log(x)}pdfCompiler.compile()
0赞 RAllen 5/16/2023
谢谢@slebetman!我也为此场景添加了一个示例。