我在搜索回调函数,到目前为止,我所理解的回调函数是一个函数,它作为参数传递给另一个函数。
为什么要使用回调函数?回调函数的优点是什么?在stack overflow和其他网站上有很多答案,但它们都不能帮助我理解回调的真正优势。
发布于 2016-07-13 01:04:43
其优势主要体现在异步函数上。
var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { // things you want to perform after request is done. }; xhttp.open("GET", url, true); xhttp.send();这样,您就不需要像使用setInterval(...).
例如:
object.onclick=function(){// things you want to perform after the object is clicked};
var yourApi = function(passInCallback){ var args; //do some common things... passInCallback(args); }
然后,您的应用编程接口用户可以在执行常见函数后执行不同的行为。
这就是我目前能想到的全部。
发布于 2016-07-13 00:25:53
JavaScript只有一个执行线程。
JavaScript不会抢占正在运行的线程。
在清空调用堆栈之前,程序代码中的任何其他内容都不能运行。这就是所谓的“运行到完成”。
因此,在您的程序中运行的任何东西都会阻塞其他所有东西(字面上是所有东西)。
因此,如果您有任何东西是由CPU以外的任何东西绑定的(比如网络请求,或等待用户),那么它在CPU方面是非常浪费的,因为执行线程会被简单地等待发生的事情阻塞。因此CPU处于空闲状态。
因此,JavaScript运行时提供了避免这种情况的机制。它使以等待(如网络请求)为特征的功能成为异步的。
这意味着执行的JavaScript线程可以继续,而运行时将等待您的执行。
您可以提供对这些异步函数的回调来指定延续。即,当异步操作完成时,控制流应该从何处拾取。
当异步操作完成时,运行库将"Job“放在运行库内部的"Job Queue”上。
这些作业封装了函数指针(回调)和调用回调时使用的参数。
当调用堆栈下一次为空并且队列中的其他作业已经完成时,则从作业队列中移除该作业,并实例化(“执行上下文”)堆栈帧并将其放置在堆栈上。
然后运行库开始从此堆栈帧执行。
有时,这种行为被包装在promise API中,以使其更加方便,但机制是相同的。
setTimeout(callback, 2000);
document.write('Cool, I can do some stuff while the setTimeout is waiting.');
function callback() {
document.write('Hello from the callback.');
}
https://stackoverflow.com/questions/38334165
复制相似问题