如果你了解编程,你应该已经知道函数的功能以及如何使用函数。但是,什么是回调函数呢?回调函数是 JavaScript 的一个重要部分。如果你理解了它如何运行,你就能更擅长编写 JavaScript。
在这篇文章里,我会通过一些例子帮助你理解什么是回调函数,如何在 JavaScript 中使用它们。
什么是回调函数?
在 JavaScript 中,函数即对象。我们可以将对象作为参数传递给函数吗?答案是“可以”。
所以,我们可以将函数作为参数传递给其他函数,在外部函数中调用它。听起来有点复杂?我们看一下下面的例子:
function print(callback) {
callback();
}
print( ) 函数将另一个函数作为参数,并在函数体内部调用它。在 JavaScript 里,我们叫它“回调”。所以,被传递给另一个函数作为参数的函数叫作回调函数。
为什么需要回调函数?
JavaScript 按从上到下的顺序运行代码。但是,在有些情况下,必须在某些情况发生之后,代码才能运行(或者说必须运行),这就不是按顺序运行了。这是异步编程。
回调函数确保:函数在某个任务完成之前不运行,在任务完成之后立即运行。它帮助我们编写异步 JavaScript 代码,避免问题和错误。
在 JavaScript 里创建回调函数的方法是将它作为参数传递给另一个函数,然后当某个任务完成之后,立即调用它。
如何创建回调函数
我们通过一个简单的例子来理解上面的内容。我们想在控制台打印一条消息(message),它在 3 秒之后显示。
const message = function() {
console.log("This message is shown after 3 seconds");
}
setTimeout(message, 3000);
JavaScript 有一个内建方法叫作 “setTimeout”,它会在给定的时间段(以毫秒为单位)后调用函数或计算表达式。因此,在这里,经过 3 秒后将调用 message 函数(1 秒= 1000 毫秒) 。
换句话说,message 函数是在发生某事之后(在本示例中为 3 秒之后),而不是在此之前被调用。因此,message 函数就是一个回调函数
什么是匿名函数?
此外,我们可以直接在另一个函数内定义一个函数,而不是调用它,比如:
setTimeout(function() {
console.log("This message is shown after 3 seconds");
}, 3000);
我们可以看到,这里的回调函数没有名称。在 JavaScript 里,一个没有名称的函数叫作“匿名函数”。这个例子和上面的例子执行的任务一样。
用箭头函数写回调函数
你也可以用 ES6 箭头函数写回调函数。箭头函数是 JavaScript 里的一种新的函数形式。
setTimeout(() => {
console.log("This message is shown after 3 seconds");
}, 3000);
什么是事件?
JavaScript 是一种事件驱动的编程语言。我们还将回调函数用于事件声明。例如,假设我们希望用户单击按钮:
<button id="callback-btn">Click here</button>
这次,只有当用户单击按钮时,我们才会在控制台上看到一条消息:
document.queryselector("#callback-btn")
.addEventListener("click", function() {
console.log("User has clicked on the button!");
});
因此,在这里我们首先通过 ID 选择按钮,然后使用 addEventListener 方法添加一个事件监听器。它有 2 个参数。第一个是其类型,即“click(单击)”,第二个参数是回调函数,该函数记录单击按钮时的消息。
所以,回调函数也用于 JavaScript 中的事件声明。
总结
回调函数在 JavaScript 编程中比较常用。我希望这篇文章可以帮助你理解它是如何运行的,以及如何更好地使用它。接下来,可以学习另一个主题:JavaScript Promises。
谢谢阅读!
原文:JavaScript Callback Functions – What are Callbacks in JS and How to Use Them,作者:Cem Eygi