前言

我个人在学习Node.js相关知识时遇到了回调函数这个概念,虽然之前已经在c,c++等编程语言中用到过它,但还一直未对其机制有深入了解,这次就来好好谈一下它。

概念理解

百度对它的解释是回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

Google里的解释是A callback is a function that is passed as an argument to another function and is executed after its parent function has completed.

字面上的理解,回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。

这里我想把它通俗化来讲,小时候大家应该都有自己喜欢看的动画片,但是平时上学期间我们都会被家长“严格管制”。下午放学回家后,爸妈会让自己先写完作业才能看电视里放的动画片。

其实这就是一个回调的过程。你建了个函数b(看动画片),但前提是要写完作业,写作业的过程相当于执行函数a。在现实生活中你要写完作业才能看动画片,即在执行过程中需要等函数a执行完之后才能执行函数b。

不过必须清楚一点:函数b是以参数形式传给函数a的,b是回调函数。

简单的例子

function a(callback){
   alert("这是first函数a");
   var x =1;
   var y=2;
  return callback(x,y);
 }
 function b(x,y){
   alert("这是回调函数b");
   return x+y;
 }
 $(function(){
   var result = a(b);
   alert("result = "+ result);
 });

输出结果为:

这是first函数a

这是回调函数b

result = 3

这里函数首先执行了first函数a,之后调用了回调函数b,最后返回函数a的返回值。

回调函数的种类(按功能划分)

1.同步回调

它是一种阻塞式回调,比方说一段代码逻辑没有执行完毕,代码会一直等待,而不会去执行下一段代码逻辑。

2.异步回调

它是一种非阻塞式回调,比方说一段代码逻辑没有执行完毕,代码执行可以不卡在这块不动,而是可以去执行下一段代码逻辑。

二者根本区别

在同步回调里,回调函数的调用一定发生在主函数返回之前。

在异步回调里,回调函数的调用有可能是在起始函数返回之后。

应用场景

回调函数应用场景多用在使用 js 写组件时,尤其是组件的事件很多都需要回调函数的支持。

最后,本人之前接触js并不算很多,所以具体应用问题还需实践检验。

js中回调函数(callback)的一些理解的更多相关文章

  1. node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了

    最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...

  2. C++中回调函数(CallBack)的使用

    如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而 ...

  3. JS中回调函数的写法

    <!DOCTYPE HTML> <html><head>  <meta charset="GBK" /><title>回 ...

  4. js中回调函数,promise 以及 async/await 的对比用法 对比!!!

    在编程项目中,我们常需要用到回调的做法来实现部分功能,那么在js中我们有哪些方法来实现回调的? 方法1:回调函数 首先要定义这个函数,然后才能利用回调函数来调用! login: function (f ...

  5. JS 自定义回调函数callback

    1 应用场景:js的异步加载,在get,post,ajax异步加载的时候,可能对应的请求没有完成,这时需要使用请求回来的数据作为参数调用其他函数,这时就需要使用回调函数. 2 回调函数作用:等待函数调 ...

  6. 回调函数 callback 的简单理解

    回调函数指当我执行完某一段代码之后在回过头来调用 jquery 最简单的例子 $(".className").each(function(i){alert(i)}) 她这个形参i是 ...

  7. [js]js中回调函数

    //回调函数: 把一个函数当参数传给另个函数 /* function f1() { console.log('f1'); } function f2(f) { f(); console.log(1); ...

  8. js中回调函数写法

    第一种方式 function studyEnglish(who){ document.write(who+"学习英语</br>"); } function study( ...

  9. JS中回调函数的简单用法

    a能拿b,b能拿到c,c能拿到d,实现a拿到d的东西. function a() { b(function (data) { console.log(data); }); } function b(c ...

随机推荐

  1. Reactor系列(二)Flux Mono创建

    Flux Mono创建 视频讲解:https://www.bilibili.com/video/av78844777/ FluxMonoTestCase.java package com.exampl ...

  2. 【转帖】龙芯将两款 CPU 核开源,这意味着什么?

    龙芯将两款 CPU 核开源,这意味着什么? https://www.oschina.net/news/78316/loongson-open-source-two-cpu-core 文章挺不错的 也讲 ...

  3. Hystrix的概念

             Netflix的 Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力.       Hystrix的设计原则包括:资源隔离.熔断器.命令模 ...

  4. THUSC2013

    魔塔 BZOJ 设每个敌人的属性值为\(hp_i,atk_i,def_i\).自己的为\(HP,ATK,DEF\) 首先我们可以发现顺序是没有影响的. 然后我们可以发现合适的\(ATK\)一定满足\( ...

  5. 在Visual C++ 6.0中为代码添加行号

    由如上代码可知Visual C++ 6.0是没有行号的(新手代码不要在意,重点是没有行号),在编译报错的时候会发现其会指出在第几行错了,如果没有代码行号将很难找到它 为解决这个问题可以安装插件给Vis ...

  6. 【Python基础】10_Python中的字典

    1.字典的定义 和列表的区别 列表是 有序 对象的集合 字典是 无序 对象的集合 字典用 {} 定义 键 key 是索引 值 value 是数据 键 和 值 之间用 :分割 键 必须是唯一的 值 可以 ...

  7. 怎样修改一个已存在的Cookie

    Cookie的修改也需要借助 Response-Header 的 Set-Cookie 字段, 不过需要注意的是: 待修改cookie的 key / domain / path / secure 必须 ...

  8. Nginx用法详解

    nginx作为一个高性能的web服务器,想必大家垂涎已久,蠢蠢欲动,想学习一番了吧,语法不多说,网上一大堆.下面博主就nginx的非常常用的几个功能做一些讲述和分析,学会了这几个功能,平常的开发和部署 ...

  9. sqlserver错误状态码解释

    Code Error Message 0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块 ...

  10. Maven错误:警告Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published

    该错误是在我将一个普通的由maven管理的java项目变为javaweb项目后出现的,由警告可以看出是说maven的类路径容器不会被导出或发布(即通过maven管理的依赖不会被导出或发布),那么我们用 ...