一、什么是回调函数

1、回调函数是作为参数传递给另一个函数

2、回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码

3、 函数运行完成,再执行回调函数

1、回调函数

function add(num1, num2, callback){var sum = num1 + num2;callback(sum);
}function print(num){console.log(num);
}add(1, 2, print);      //=>3

2、匿名回调函数

function add(num1, num2, callback){var sum = num1 + num2;callback(sum);
}add(1, 2, function(sum){console.log(sum);      //=>3
});

二、回调函数的特点

1、不会立刻执行
回调函数作为参数传递给一个函数的时候,传递的只是函数的定义并不会立即执行。和普通的函数一样,回调函数在函调用函数数中也要通过()运算符调用才会执行。

2、是个闭包
回调函数是一个闭包,也就是说它能访问到其外层定义的变量。

3、执行前类型判断
在执行回调函数前最好确认其是一个函数。

function add(num1, num2, callback){var sum = num1 + num2;if(typeof callback === 'function'){callback(sum);}
}

三、回调函数的传参

如果回调函数需要传参,如何做到,这里介绍两种解决方案。

1、将回调函数的参数作为与回调函数同等级的参数进行传递

function say(content){console.log(content);
}
// say()是回调函数,回调函数需要参数contentfunction test(callback,content){callback(content);
}test(say,'hello nodejs');

2、回调函数的参数在调用回调函数内部创建

function say(content){console.log(content);
}function test(callback){content='hello nodejs';callback(content);
}test(say);

四、回调函数里为什么需要return?

一方面,return的可以中断后面的逻辑执行。另一方面,代码会更加清晰

这是else的情况:

function dosomething(param) {func1(param, function(err, data) {if (err)console.log(err)else {func2(param, function(err, data) {if (err)console.log(err)else {func3(param, function(err, data) {if (err)console.log(err)else {console.log(result)}}}}}}
}

改造成return是这样:

function dosomething(param) {func1(param, function(err, data) {if (err)return console.log(err)func2(param, function(err, data) {if (err)return console.log(err)func3(param, function(err, data) {if (err)return console.log(err)console.log(result)}}}
}

五、回调函数中this的使用

注意在回调函数调用时this的执行上下文并不是回调函数定义时的那个上下文,而是调用它的函数所在的上下文。

var obj = {sum: 0,add: function(num1, num2){this.sum = num1 + num2;}
};function add(num1, num2, callback){callback(num1, num2);
};add(1,2, obj.add);
console.log(obj.sum);           //=>0
console.log(window.sum);        //=>3

上述代码调用回调函数的时候是在全局环境下,因此this指向的是window,所以sum的值是赋值给windows的。

关于this执行上下文的问题可以通过apply方法解决

var obj = {sum: 0,add: function(num1, num2){this.sum = num1 + num2;}
};function add(num1, num2, callbackObj, callback){callback.apply(callbackObj, [ num1, num2 ]);
};add(1,2, obj, obj.add);
console.log(obj.sum);           //=>3
console.log(window.sum);        //=>undefined

六、应用示例

Example:

fs.readFileSync( )函数里面定义了回调函数,故可以一边读取文件,一边执行其他命令,在文件读取完成后,再将文件内容作为回调函数的参数传入回调函数并执行回调函数。

1、阻塞代码示例

特点:按顺序执行。在文件读取完后才执行完程序

创建一个文件 input.txt ,内容如下:

hello nodejs

创建 main.js 文件, 代码如下:

var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());console.log("程序执行结束!");

以上代码执行结果如下:

$ node main.js
hello nodejs
程序执行结束!

2、非阻塞代码示例

特点:非顺序执行。不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

创建一个文件 input.txt ,内容如下:

hello nodejs

创建 main.js 文件, 代码如下:

var fs = require("fs");
fs.readFile('input.txt', function (err, data) {if (err) return console.error(err);console.log(data.toString());
});console.log("程序执行结束!");

以上代码执行结果如下:

$ node main.js
程序执行结束!
hello nodejs

参考链接

http://cnodejs.org/topic/564dd2881ba2ef107f854e0b

Node.js —— 回调函数callback相关推荐

  1. node.js 回调函数

    Node.js 回调函数 Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了. 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数, ...

  2. JS回调函数(callback)

    在使用Jquery的时候,用到Callback(),回调函数的概念.而且很多. 比如: $.ajax({url:"test.json",type: "GET", ...

  3. [Node.js]回调函数

    简介 Node.Js异步编程的直接表现方式就是回调.异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了.回调函数在完成任务后就会被调用,Node使用了大量的回调函数,node所有api都支持 ...

  4. 17.Node.js 回调函数--异步编程

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程 ...

  5. Node.js回调函数

  6. js回调函数的理解(轉)

    js回调函数(callback)理解Mark!讲之前说一句function say(){alert(,,,,,,,,)}var say=function (){alert(,,,,,,,)}var s ...

  7. mysql.js回调函数_js回调函数(callback)

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

  8. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  9. html js 回调函数,js中回调函数的学习笔记

    回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下吧,有需了解的同学不防进入参考. 回调函数原理: 我现在出发,到了通知你" ...

最新文章

  1. win10 tensorrt安装 踩坑记录
  2. Java黑皮书课后题第1章:1.13(代数:求解2*2线性方程组)编写程序,求解以下方程组并显示x和y的值 3.4x+50.2y=44.5 2.1x+0.55y=5.9
  3. 银屑病相关饮食调研-毛蕊花的药用部位没查清-还需更新
  4. 为什么要重写hashCode()
  5. 手机操作系统学习总结
  6. 360wifi使用方法|360wifi使用教程
  7. 固态硬盘数据丢失能恢复吗?含泪分享:固态硬盘数据恢复方法
  8. HTML5+CSS3笔记 (黑马pink老师)
  9. 记录使用git时出现Permission denied 问题的解决
  10. 为了讨好程序员,阿里云和 Costa 开了家码农咖啡馆
  11. word怎么删除参考文献的横线_word2016怎么去掉引用参考文献中的横线
  12. 搜索引擎蜘蛛抓取不到网站内容页面的原因总结
  13. 《基础会计学》期末模拟试题及答案
  14. 基于STM32单片机的天然气甲烷硫化氢气体检测仪原理图PCB
  15. 详细的HTTP代理和SOCKS代理
  16. 破解邻居家电脑wifi 密码
  17. 如何将WMA文件转换为MP3
  18. Java根据内容生成图片
  19. 易语言返回数组数据的解决方法
  20. 饥荒服务器linux,搭建饥荒服务器

热门文章

  1. Centos7网络ip配置
  2. 进行游戏角色设计 设计要领必须要掌握
  3. ofo线上排队退款用户已超1000万;滴滴发布27项整改措施;SpaceX将融资5亿美元 | 雷锋早报...
  4. jmeter响应断言
  5. jmeter断言操作——响应断言
  6. Disruptor介绍使用
  7. java网页保存pdf_JavaScript+Java实现HTML页面转为PDF文件保存的方法
  8. 2022-2028全球与中国室内垂直农场市场深度分析及十四五规划咨询建议报告
  9. CrownCAD(皇冠CAD)参数化设计:如何灵活应用“变量”,快速实现模型的参数化设计与迭代?
  10. 微信小程序 scroll-view不触发解决