什么是回调函数以及回调地狱

回调函数

被作为参数传递的函数。

如果一个函数被作为参数传递,那么它就是一个回调函数。

简单来说,一个函数正在执行,它执行完了干嘛?执行你传进来的那个作为参数的函数,这个函数就是回调函数。

例子:你妈让你吃完饭去睡觉。在这个例子中,你正在执行的是吃饭这个函数,你妈给你传递了一个睡觉的函数,你吃完饭(也就是执行完该程序)就要去睡觉(执行你妈给你传进来的函数),下面看代码实现:

//吃饭是主函数,todo是你妈传进来的任务,也就是所谓的回调函数。
function Eat(todo){
    //你正在吃饭
    alert("我正在吃饭");
    //你吃完饭了,要去执行你妈给你传进来的任务了
    todo();
}

function sleep(){
    alert("我要去睡觉")
}
Eat(sleep);

你妈可能不想让你吃完饭就睡觉了,她让你吃完饭去洗锅:

//吃饭是主函数,todo是你妈传进来的任务,也就是所谓的回调函数。
function Eat(todo){
    //你正在吃饭
    alert("我正在吃饭");
    //你吃完饭了,要去执行你妈给你传进来的任务了
    todo();
}

function sleep(){
    alert("我要去睡觉")
}
function wash(){
    alert('我要去洗锅')
}
//此时传递的是洗锅这个函数
Eat(wash);

当然,实际使用中有时并不是先定义函数,然后再传递变量,也可以直接传递函数:

//吃饭是主函数,todo是你妈传进来的任务,也就是所谓的回调函数。
function Eat(todo){
    //你正在吃饭
    alert("我正在吃饭");
    //你吃完饭了,要去执行你妈给你传进来的任务了
    todo();
}

function sleep(){
    alert("我要去睡觉")
}

//此时传递的是一个匿名函数
Eat(function(){
    alert('我要去洗锅')
});

看完上面的例子,你可能发现了一个特点,回调函数是我们创建的但并不是我们直接调用的

比如在上面的例子中,我们创建了洗锅和吃饭的函数,吃饭的函数是我们直接调用的,而洗锅这个函数是我们传递吃饭函数的一个参数,由吃饭函数调用的。

想想定时器函数,会往里面传递两个参数,第一个参数就是回调函数,第二个参数是间隔时间。

定时器函数执行定时的任务,比如间隔时间是一秒,一秒之后定时器的任务结束了,就会调用回调函数。

setTimeout(function(){alert('我是定时器一秒后调用的回调函数')},1000);

缺点

那么,回调函数有什么缺点吗?

如果让我们每秒输出一次,总共输出五次,使用回调函数怎么做?

先设置第一个延时器,执行完调用回调函数,回调函数里再设置一个延时器,执行完调用回调函数的回调函数,回调函数的回调函数再设置定时器,执行完调用回调函数的回调函数的回调函数。。。

无限套娃。。。

setTimeout(function() {
				console.log('我是定时器一秒后调用的回调函数');
				setTimeout(function() {
					console.log("我是定时器两秒后调用的回调函数");
					setTimeout(function() {
						console.log("我是定时器三秒后调用的回调函数");
						setTimeout(function() {
							console.log("我是定时器四秒后调用的回调函数");
							setTimeout(function() {
								console.log("我是定时器五秒后调用的回调函数");
							}, 1000)
						}, 1000)
					}, 1000)
				}, 1000)
			}, 1000);

这只是输出五次,要是输出十次,一百次,一万次呢?

太恐怖了吧!

这,就是传说中的回调地狱(Callback hell)

回调地狱不利于阅读和维护,也存在着高耦合性,不易更改的问题,我们应该在使用中要避免回调地狱的出现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值