概述
一、什么是回调函数
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()是回调函数,回调函数需要参数content
function 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的全部内容,希望文章能够帮你解决Node.js —— 回调函数callback所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复