回调函数
定义
A callback is a function that is passed as an argument to another function and is executed after its parent function has completed.
回调是一个函数,它作为参数传递给另一个函数,并在其父函数完成后执行。
函数也是对象
1、函数是一种对象
function test() {};
console.log(test instanceof Object); // true
很明显函数是一种对象,但你不能说函数是对象的一种。因为他俩之间是没有包含关系的。有点像鸡蛋和鸡的关系。
2、对象都是通过函数创建的
先来看一个例子
function test() {
this.name="哈哈"
};
var test2=new test();
console.log(test2 instanceof Object); //true
这个例子可以说明对象可以被函数创建。那为什么要说对象都是通过函数创建的,那对象字面量是不是也是通过函数来创建的,答案是肯定的,这是一种语法糖方式。举个简单的例子
var obj={
name:"哈哈",
age:"18"
}
var obj=new Object()
obj.name="哈哈";
obj.age="18";
上面的对象字面量其实是通过下面的构造函数来创建的。而其中的Object是一种函数:
console.log(typeof Object) //function
通过上面的简单例子我们可以得出一个结论:对象是通过函数创建的,而函数又是一种对象。
js的函数可以作为参数进行传递
再看下面两段代码:
function say (value) {
console.log((value));
}
function execute (someFunction, value) {
someFunction(value);
}
execute(say, 'hi js.');
与
function execute (someFunction, value) {
someFunction(value);
}
execute(function(value){console.log((value));}, 'hi js.');
上面第一段代码是将say方法作为参数传递给execute方法
第二段代码则是直接将匿名函数作为参数传递给execute方法
实际上:
function say (value) {
alert(value);
}
// 注意看下面,直接写say方法的方法名与下面的匿名函数可以认为是一个东西
// 这样再看上面两段代码是不是对函数可以作为参数传递就更加清晰了
say;
function (value) {
alert(value);
}
这里的say或者匿名函数就被称为回调函数!
回调函数是闭包
都能够我们将一个毁掉函数作为变量传递给另一个函数时,这个毁掉函数在包含它的函数内的某一点执行,就好像这个回调函数是在包含它的函数中定义的一样。这意味着回调函数本质上是一个闭包。
正如我们所知,闭包能够进入包含它的函数的作用域,因此回调函数能获取包含它的函数中的变量,以及全局作用域中的变量。
如何避免回调地狱
你可以有如下几个方法:
• 模块化:将回调函数分割为独立的函数
• 使用Promises
• 使用yield
• 来计算生成器或Promise
解析:这个问题有很多种答案,取决你使用的场景,例如ES6, ES7,或者一些控制流库。