博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.1 回调函数
阅读量:4986 次
发布时间:2019-06-12

本文共 1421 字,大约阅读时间需要 4 分钟。

引言:

  当我们在接触到一个新知识的时候,一般都会遇到三个问题:是什么?有什么用(什么时候用,用来干什么)? 怎么用?

  这三个问题,也就是我们要学习一块新知识要解决的问题。

 

一、什么是回调函数?

所谓的回调函数就是:你定义的,你没有调用,但是最终它执行了,这样的函数就是回调函数;

如:

// 同步回调let arr = ['a', 'b', 'c']// forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;arr.forEach((value) => {    console.log(value); // a, b, c})// 异步回调$.get(url, callbackfn(data))

遍历数组时,forEach(callbackfn)要求我们传入的就是一个回调函数,我这里传入的是箭头函数(匿名函数),这个函数

是我定义的,我没有调用,但是它最终执行了。

 

二、回调函数有什么用?

  回调函数与同步、异步并没有直接的联系,回调只是一种实现方式,既可以有同步回调,也可以有异步回调,

还可以有事件处理回调和延迟函数回调,这些在我们工作中有很多的使用场景。

  所以,其实并不是我们不认识回调函数,而是我们都萦绕在了这个“callback“ 这个词上,当你在一个函数中看到

它是就会困惑,其实它只是一个形参名字而已,只不过这个参数是一个函数。而这里的forEash函数为高阶函
数(接收函数作为参数或将函数作为输出返回的函数称为高阶函数)。

 

为什么要使用回调函数?

(1) 关于回调函数和js单线程以及js异步机制

  由于js是单线程的,这种设计模式给我们带来了很多的方便之处,我们不需要考虑各个线程之间的通信,也不需要写很多烧脑的代码,

也就是说js的引擎只能一件一件事的去完成和执行相关的操作,所以所有需要执行的事情都像排队一样,等待着被触发和执行,可是如果这
样的话,如果在队列中有一件事情需要花费很多的时间,那么后面的任务都将处于一种等待状态,有时甚至会出现浏览器假死现象,例如其
中有一件正在执行的一个任务是一个死循环(话费较长的时间),那么会导致后续其他的任务无法正常执行,所以js在同步机制的缺陷下设计
出了异步模式。
  在异步执行的模式下,每一个异步的任务都有其自己一个或着多个回调函数,这样当前在执行的异步任务执行完之后,不会马上执行事
件队列中的下一项任务,而是执行它的回调函数,而下一项任务也不会等当前这个回调函数执行完,因为它也不能确定当前的回调合适执行
完毕,只要引它被触发就会执行。

 

 (2) js的单线程浏览器内核的多线程

浏览器的内核是多线程的,如图:cayley的草图

 

浏览器常驻三大线程:  js引擎线程,GUI渲染线程,浏览器事件触发线程

浏览器是一个多线程的执行环境,在浏览器的内核中分配了多个线程,最主要的线程之一即是js引擎的线程,同时js事件队列中的异步请求,

交互事件触发,定时器等事件都是由浏览器的事件触发线程进行监听的,浏览器的事件触发线程被触发后会把任务加入到js 引擎的任务队列

中,当js 引擎空闲时候就会开始执行该任务。

 

参考文档:

转载于:https://www.cnblogs.com/shiyun32/p/11294450.html

你可能感兴趣的文章
Codeforces Round #410 (Div. 2)B. Mike and strings(暴力)
查看>>
CABasicAnimation 基础
查看>>
delphi通过Idhttp和php交互
查看>>
两栏布局的写法
查看>>
多线程学习笔记五之读写锁实现分析
查看>>
linux内核分析(网课期末&地面课期中)
查看>>
Spring中的设计模式2
查看>>
vue项目向小程序迁移调研
查看>>
Jquery权威指南
查看>>
CSS hack大全(转)
查看>>
ZOJ - 3229 Shoot the Bullet (有源汇点上下界最大流)
查看>>
【14】redis
查看>>
蓝桥杯/第四届/猜年龄
查看>>
LeetCode-Letter Combinations of a Phone Number
查看>>
关于ubuntu的图形界面的关闭与开启
查看>>
Codeforces Round #400 E. The Holmes Children
查看>>
hdu 1759 Matrix Revolution(矩阵转BFS)
查看>>
LintCode-88.最近公共祖先
查看>>
WCF
查看>>
861. Score After Flipping Matrix
查看>>