rt问题如上--最好麻烦贴一下代码
var fn = function (callback) {
callback('callback');
};
fn(function (value) {
console.log(value);
});
//回调函数:函数中的参数如果是另一个函数的话,那么这个作为参数的函数就是回调函数,可以在需要的时候在函数体内调用这个函数。
function a(callback){ //4、找到函数a(),执行。 //11、第二次执行函数a()。
console.log("我是parent函数a!"); //5、输出。 //12、输出。
console.log("调用回调函数"); //6、输出。 //13、输出。
callback(); //7、执行传递过来的函数b()。 //14、执行传递过来的函数c()。
}
function b(){ //8、找到函数b()
console.log("我是回调函数b"); //9、输出,完成函数a()回调函数b()的执行。
}
function c(){ //15、找到函数c()。
console.log("我是回调函数c"); //16、输出。
}
function test(){ //2、找到函数test(),执行函数。
a(b); //3、执行函数a(b)。
a(c); //10、执行函数a(c)。
}
test(); //1、执行函数test()。
/*输出顺序:
我是parent函数a!
调用回调函数
我是回调函数b
我是parent函数a!
调用回调函数
我是回调函数c
*/
这是我之前看到的一个例子,然后我把顺序撸了一遍并注释。
函数的参数本身是一个函数那么我们就称之为回调函数(callback),比如setTimeout
的第一个参数
个人常用的两种场景:
异步回调 (操作需要网络请求等耗时的操作,操作完成后执行指定的函数)
//比如
$.get("http://api.xxxx.com/xxx",callback);
同步回调 (操作不耗时,但需要不同的处理方案)
function add(a, b, callback) {
callback(a+b);
}
add(1,2,function(result) {
console.log("result:" + result);
});
add(1,2,function(result){
console.log("结果是:" + result);
});
简单理解,callback
就是方法里面套的一个方法,这个方法就是回调函数。
nodejs 一般在调用一个方法的时候,把错误和结果放到回调函数里做处理
eat(function(err,food){
if(err) {
console.log(err);
return;
} //吃的噎着了,不能吃了
console.log(food); //吃的什么东西,味道还不错
})
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
一个函数的作用是完成某一部分的任务,
一个十分耗时的任务,可以让程序等待这个任务执行完成,获得返回值然后程序继续执行,这种叫做同步执行。也可让后台默默的先接收下这个任务,当前的程序继续往下执行,等后台执行完成这个任务,通过某种方式把处理结果发送给当前的程序,这种叫做异步执行。通信的方式可以是信号量,事件,回调,轮询等。比如一个
Ajax
任务需要 10s 钟:同步的方式执行
syncAjax
直到 10s 之后这句才会执行完成,把 Ajax 的数据赋值给data
。所以10s 之后才会执行console.log('sync return !');
。这种方式在 JS 不太好,因为JS是单线程,一直在这里等待 10s ,那么将会后很长时间整个浏览器没有响应,所以不可取。当然 nodejs 里面也提供了很多同步的函数。对于异步执行的
asyncAjax
,这一句立即执行完毕,所以会立即输出console.log('async return !')
,可是由于Ajax 还没有完成,所以不能把ajax 的数据返回给当前执行的程序(因为系统还没有获得服务器发送回来的值)。等到服务器返回数据了,需要用某种方式通知当前的程序,回调函数就是一种。比如当后台获得Ajax的数据g
data
,系统调用回调函数processData
,其中第一个参数是服务器返回的数据data
,这样当前的程序就可以通过processData
处理 ajax 返回的数据了。