← 返回首页
Javascript基础教程(二十一)
发表时间:2020-03-29 12:52:51
讲解Javascript的回调函数

回调函数是作为参数传给另一个函数的函数,然后通过在外部函数内部调用该回调函数以完成某种操作。

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