Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么回调函数允许我们在Javascript中异步执行操作?_Javascript_Asynchronous_Callback_Language Concepts - Fatal编程技术网

为什么回调函数允许我们在Javascript中异步执行操作?

为什么回调函数允许我们在Javascript中异步执行操作?,javascript,asynchronous,callback,language-concepts,Javascript,Asynchronous,Callback,Language Concepts,我读过回调异步生成JavaScript的文章。但是我不确定我是否理解了这个解释。这就是我得到的 回调函数允许我们异步执行操作,因为它们确保 回调之前的行在加载之前完全完成 下一行 这是真的吗?谢谢首先,不是回调启用了任何功能。node.js甚至基于浏览器的javascript中的给定操作要么是异步的,要么不是异步的。它实际上与回调无关,尽管回调通常用于传递异步操作的结果 例如,Javascript的array.forEach()使用回调,但它不是异步的。因此,异步操作是异步的,因为它们的底层实现

我读过回调异步生成JavaScript的文章。但是我不确定我是否理解了这个解释。这就是我得到的

回调函数允许我们异步执行操作,因为它们确保 回调之前的行在加载之前完全完成 下一行


这是真的吗?谢谢首先,不是回调启用了任何功能。node.js甚至基于浏览器的javascript中的给定操作要么是异步的,要么不是异步的。它实际上与回调无关,尽管回调通常用于传递异步操作的结果

例如,Javascript的
array.forEach()
使用回调,但它不是异步的。因此,异步操作是异步的,因为它们的底层实现是非阻塞的。通过进行函数调用开始操作,操作在后台进行,其余代码继续运行。同时,当异步操作完成时,它通常需要告诉您的代码它已经完成,并且可能需要传递一些结果。回调函数是用于通信异步操作完成情况的所选机制

我读过回调异步生成JavaScript的文章

不,那不是真的。回调也可以用于同步操作。仅仅因为使用回调并不能使任何事情异步。操作的底层本机代码实现必须是异步的(例如Ajax调用或其他网络操作)。回调用于传递异步操作的结果。它们还有许多其他非异步用途。因此,回调只是异步操作中使用的一种工具,回调也是一种具有许多其他用途的工具。您不能说
回调===异步

回调函数允许我们异步执行操作,因为它们 确保回调之前的行已完全完成 在加载下一行之前

很难说清楚你这是什么意思,但我听上去不对。使用异步操作时,代码通常不会按照文件中列出的顺序执行。例如,如果您这样做:

console.log("async start");
callSomeAsyncOperation(function(result) {
    console.log("async done");
});
console.log("I'm here now");
您将在日志中看到:

async start
I'm here now
async done

已解释回调和事件队列

了解异步操作的工作原理也可能很有用。Javascript在事件队列中工作。给定的Javascript代码序列一直运行到完成。完成后,引擎在事件队列中查看是否还有其他事件要处理。如果是这样,将拉出队列中的第一个事件,并调用为该事件注册的回调。这将启动一个新的Javascript代码运行序列。该代码将继续运行,直到完成为止。完成后,引擎将检查是否存在其他事件。如果有,则通过调用与该事件关联的回调来处理该事件。当没有更多的事件要处理时,引擎进入休眠状态,等待下一个事件。当一个事件发生时(在主Javascript thead之外),它会被添加到队列中,而将其添加到队列的过程会导致JS引擎唤醒并服务于该事件

在编写Javascript时,通常会注册事件的事件处理程序。这在Javascript中的工作方式是,您说出您感兴趣的事件(这可能还包括指定一些其他信息,例如查找事件的对象),然后将其传递为函数引用。实际上,您是在告诉Javascript引擎,希望它在发生此事件时调用函数引用。这种类型的函数引用称为“回调”。它只是一个普通的函数,但是它所使用的上下文被称为“回调”,因为其他一些代码会在将来某个时候通过执行您的函数来“回调”。然后,您可以在该函数引用(回调函数内部)中放置适当的代码,以响应该事件。根据事件的类型,您可能只会被呼叫一次,或者每次事件发生时它都会呼叫您

您可以在以下参考中阅读有关此事件队列和回调如何工作的更多信息:


(写的是关于浏览器的,但概念是一样的)

首先,不是回调启用了任何东西。node.js甚至基于浏览器的javascript中的给定操作要么是异步的,要么不是异步的。它实际上与回调无关,尽管回调通常用于传递异步操作的结果

例如,Javascript的
array.forEach()
使用回调,但它不是异步的。因此,异步操作是异步的,因为它们的底层实现是非阻塞的。通过进行函数调用开始操作,操作在后台进行,其余代码继续运行。同时,当异步操作完成时,它通常需要告诉您的代码它已经完成,并且可能需要传递一些结果。回调函数是用于通信异步操作完成情况的所选机制

我读过回调异步生成JavaScript的文章

不,那不是真的。回调也可以用于同步操作。仅仅因为使用回调并不能使任何事情异步。操作的底层本机代码实现必须是异步的(例如Ajax调用或其他网络操作)。回调用于传递异步操作的结果。它们还有许多其他非异步用途。因此,回调只是异步操作中使用的一种工具,回调是一种工具