回调函数是作为参数传给另一个函数的函数,然后通过在外部函数内部调用该回调函数以完成某种操作。
1.函数名字可以作为参数传递
例如:
<script>
function say (value) {
console.log(value);
}
console.log(say);
console.log(say('hi js.'));
</script>
运行结果:
ƒ say (value) {
console.log(value);
}
hi js.
undefined
2.回调函数
<script>
function callbackFn(){
console.log("我是回调函数");
}
function fn(callback){
callback();
}
fn(callbackFn);
</script>
运行结果:
我是回调函数
回调函数的特点: - 你定义的 - 你没有调 - 但是最终执行了(某个时刻【定时器】或者某个条件下【按钮点击事件】)
换句话说就是把回调的函数变成自执行,函数会直接输出,所以回调函数有个特点就是不会立即执行,一般是在需要执行的时候去调用,才会执行。
例如,上面的例子如果改写如下:
<script>
function callbackFn(){
console.log("我是回调函数");
}
function fn(callback){
callback();
}
fn(callbackFn()); //这里函数直接指向,就不是调用回调函数了。
</script>
运行结果:
我是回调函数
callback is not a function
如何理解在某个特定的时间执行,我们可以使用定时器。
<script>
function callbackFn(){
console.log("我是回调函数");
}
//延迟5秒后执行..
setTimeout(callbackFn,5000);
</script>
3.回调函数带参数该如何调用
例如:
<script>
function callbackFn(i, j){
console.log(i + j);
}
function fn(callback){
callback();
}
fn(callbackFn);
</script>
运行结果:
NaN
正确的写法:
<script>
function callbackFn(i, j){
console.log(i + j);
}
function fn(callback){
callback();
}
fn(function(){callbackFn(10,7)});
</script>
运行结果:
17
也可以采用以下方式:
<script>
function callbackFn(i, j){
console.log(i + j);
}
function fn(callback, x, y){
callback(x,y);
}
fn(callbackFn,10,7);
</script>
运行结果:
17
回调函数的this指向需要特别注意: 例如:
<script>
var sum = 100;
var obj = {
sum: 10,
fun: function () {
console.log(this.sum);
}
};
function con(callback) {
callback(obj);
}
obj.fun(); //10
con(obj.fun); //100
</script>
运行结果:
10
100
当我们直接调用obj.fun();输出的是10,当我们把这个方法当做参数传递给con方法之后,调用callback的是window,this指向window,所以输出的是100。
当然我们可以用call或者apply和bind来改变this指向,从而保证输出的是obj对象的sum属性。
<script>
var sum = 100;
var obj = {
sum: 10,
fun: function () {
console.log(this.sum);
}
};
function con(callback) {
callback.apply(obj);
//callback.call(obj);
//callback.bind(obj)();
}
obj.fun();
con(obj.fun);
</script>
运行结果:
10
10