摘要:首先要知道的是,回调和异步不是同一个东西我以前认为中每个回调函数都是异步处理的,实际上并不是,可以同步回调,也可以异步回调例子说到,大家都在中遇到以下的例子这些代码用了这么久,知道怎么用,但是可能对回调的概念并不是那么清晰再来个例子执行函数
首先要知道的是,回调和异步不是同一个东西
我以前认为js中每个回调函数都是异步处理的,实际上并不是,可以同步回调,也可以异步回调
说到callback,大家都在javascript中遇到以下的例子
$("#id").on("click", function(){ //code }); $("#id").setTimeout(function(){ //code },1000);
这些代码用了这么久,知道怎么用,但是可能对回调的概念并不是那么清晰
再来个例子
function a(callback) { alert("执行parent函数a!"); alert("开始调用回调函数"); callback(); alert("结束回调函数"); } function b(){ alert("执行回调函数b"); } function test() { a(b); a(function() { alert("执行匿名回调函数"); }); } test();
执行顺序:
执行parent函数a!
开始调用回调函数
执行回调函数b
结束回调函数
执行parent函数a!
开始调用回调函数
执行匿名回调函数
结束回调函数
简单的说,就是把一个函数作为形参进行传递,上面的callback参数可以改为任意名字
callback 用 C++ 实现 不带参数回调#include带参数回调using namespace std; //定义回调函数 void Print() { cout <<"Hello World! "; } //定义实现回调函数的"调用函数" void Call(void (*callback)()) { callback(); } //在main函数中实现函数回调 int main(int argc,char* argv[]) { Call(Print); return 0; }
#include异步例子using namespace std; //定义带参回调函数 void Print(string s) { cout << s << endl; } //定义实现带参回调函数的"调用函数" void Call(void (*callback)(string),string s) { callback(s); } //在main函数中实现带参的函数回调 int main(int argc,char* argv[]) { Call(Print,"Hello World!"); return 0; }
经典例子
function a(){ console.log("执行a"); setTimeout(function(){ console.log("setTimeout"); }, 1000); } function b(){ console.log("执行b"); } a(); b();
执行顺序:
执行a
执行b
setTimeout (一秒后执行)
都知道js是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,毫无疑问,这样的效率是不高的,后面的任务必须等到前面的任务执行完毕后才能执行,如果有一个比较耗时的操作,比如http请求,文件io
其他语言遇到这种比较耗时的任务往往是开一个线程来处理,但js本身就是单线程的,js对这种任务的处理就是这个一个任务挂载起来,等耗时任务完成后再把回调函数添加到执行队列尾部
所以,在刚刚这个例子中,即使把延迟时间设置为0,也是一样的结果
本文同步更新我的个人博客https://blog.yjqing.xin/js-ca...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/99211.html
摘要:同步与异步以上为同步代码,函数必须等函数执行完毕后才能执行。异步回调产生的结果就是,函数的调用并不直接返回结果,而往往是交给回调函数进行异步处理。 同步与异步: function a(){} function b(){} a(); b(); 以上为同步代码,函数b必须等函数a执行完毕后才能执行。 function a(){ ...
摘要:而是在调用发出后,被调用者通过状态通知来通知调用者,或通过回调函数处理这个调用。请求程序发出请求,从服务器端获取数据,并设置了回调函数。然后,浏览器会设置侦听来自网络的响应,拿到数据后,将该回调函数插入到事件循环。 并发与并行 并发是指两个或多个事件链随时间发展交替执行,以至于从更高的层次来看,就像是同时运行(但在任意时刻只处理一个事件) 并发的关键是你有处理多个任务的能力,不一定同...
摘要:引擎线程也称为内核,负责处理脚本程序例如引擎引擎线程负责解析脚本,运行代码。对象代表一个未完成但预计将来会完成的操作。注意一旦新建就会立即执行它属于,无法取消。 写在前面: 第一遍学Promise时, 只是大概过了一遍, 感觉学的不够深入, 这一篇算是对之前的一个总结吧. Promise在ES6中也属于一个较难理解的一部分; 所以在学习一个比较难理解的知识点时, 我们可以围绕这个知识点...
摘要:单线程异步非阻塞然后,这又牵扯到了事件循环消息队列,还有微任务宏任务这些。此步的位置不确定某个时刻后,定时器触发线程通知事件触发线程,事件触发线程将回调函数加入消息队列队尾,等待引擎线程执行。 前言 Philip Roberts 在演讲 great talk at JSConf on the event loop 中说:要是用一句话来形容 JavaScript,我可能会这样: Java...
阅读 801·2021-11-24 09:38
阅读 1032·2021-10-08 10:05
阅读 2527·2021-09-10 11:21
阅读 2772·2019-08-30 15:53
阅读 1782·2019-08-30 15:52
阅读 1891·2019-08-29 12:17
阅读 3358·2019-08-29 11:21
阅读 1551·2019-08-26 12:17