回调功能的优点用简单的英语和实例?

时间:2016-07-12 16:16:26

标签: javascript callback

我正在搜索回调函数,到目前为止我所理解的是回调函数是一个函数,它作为参数传递给另一个函数。

为什么要使用回叫功能?回叫功能有哪些优点?堆栈溢出和其他网站上有很多答案,但没有一个能帮助我理解回拨的真正优势。

2 个答案:

答案 0 :(得分:2)

优点主要体现在异步功能上。

  1. 防止对脚本代码进行不必要的检查。 例如,使用ajax获取响应: var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { // things you want to perform after request is done. }; xhttp.open("GET", url, true); xhttp.send();
    这样,您就不需要像使用setInterval(...)那样持续​​检查请求是否已完成。

  2. 处理DOM事件。 所有DOM事件都需要处理回调,因为您无法预测何时会触发事件。
    例如:
    object.onclick=function(){// things you want to perform after the object is clicked};

  3. 创建可扩展的api或插件。例如:
    var yourApi = function(passInCallback){ var args; //do some common things... passInCallback(args); }
    然后你的api用户可以在执行常用功能后执行不同的行为。

  4. 我现在能想到的全部内容。

答案 1 :(得分:1)

JavaScript只有一个执行线程。

JavaScript不会抢占正在运行的线程。

在调用堆栈清空之前,程序代码中的任何其他内容都无法运行。这称为"运行完成"。

因此,程序中运行的任何内容都会阻塞其他所有内容(字面意思是一切)。

因此,如果您有任何除了CPU以外的任何东西(如网络请求或等待用户),那么就CPU而言非常浪费,因为只需等待某些东西就可以阻止执行的线程即将发生。所以CPU闲置。

因此,JavaScript运行时提供了避免此方案的机制。它使功能以等待(如网络请求)异步为特征。

这意味着执行的JavaScript线程可以继续,而运行时会等待你。

您可以为这些异步函数提供回调以指定延续。即,当异步操作完成时,控制流应该从哪里开始。

当异步操作完成时,运行时会放置一个" Job"在"工作队列"运行时内部。

这些Jobs封装了函数指针(回调)和调用回调时使用的参数。

当调用堆栈下一个为空并且队列中的其他作业已完成时,作业将从作业队列中删除,并且实例化堆栈帧("执行上下文")并放置在叠加。

然后运行时从此堆栈帧开始执行。

有时这种行为包含在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.');
}