zoukankan      html  css  js  c++  java
  • JavaScript中的apply()和call()

    • 可以将call()和apply()看做是某个对象的方法,通过调用方法的形式来间接调用函数。
    • call()和apply()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。

    以对象o的方法来调用f(),可以这样使用call()和apply()

    f.call(o);
    f.apply(o);
    

    等同于

    o.m = f;    // 将f存储为o的临时方法
    o.m();      // 调用它,不传入参数
    delete o.m; // 将临时方法删除
    

    在调用方法之前和之后添加日志

    // 将对象o中名为m()的方法替换为另一个方法
    // 可以在调用原始的方法之前和之后记录日志信息
    function trace(o, m) {
        var original = o[m];        // 在闭包中保存原始方法
        o[m] = function () {          // 定义新的方法
            console.log(new Date(), "Entering: ", m);     // 输出日志信息
            var result = original.apply(this, arguments);    // 调用原始函数
            console.log("result: " + result);
            console.log(new Date(), "Exiting: ", m);
            return result;
        }
    }
    
    function clazz() {
        this.name = "clazz";
        this.sayHi = function () {
            return "Hi, clazz";
        }
    }
    
    var clazz1 = new clazz();
    trace(clazz1, "sayHi");
    clazz1.sayHi();    
    

    输出结果为:

    Sat Jun 23 2018 19:46:46 GMT+0800 (中国标准时间) "Entering: " "sayHi"
    result: Hi, clazz
    Sat Jun 23 2018 19:46:46 GMT+0800 (中国标准时间) "Exiting: " "sayHi"
    
    • call 和 apply二者的作用完全一样,只是接受参数的方式不太一样。

    apply:
    语法:apply(thisObj,数组参数)
    定义:应用某一个对象的一个方法,用另一个对象替换当前对象
    说明:如果参数不是数组类型的,则会报一个TypeError错误。

    call方法:
    语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
    定义:调用一个对象的一个方法,以另一个对象替换当前对象。
    说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
    如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

    f.call(o, 1, 2);
    f.apply(o, [1, 2]);
    

    参考资料

  • 相关阅读:
    linux:安装php7.x
    linux:搭建 WordPress 个人站点
    linux:lnmp环境
    knn初了解
    Pycharm:鼠标滚动控制字体大小
    数据集的获取
    弄懂Java的自增变量
    面试中的volatile关键字
    Java的类锁、对象锁和方法锁
    Error creating bean with name 'entityManagerFactory' defined in class path resource解决方案
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/9218695.html
Copyright © 2011-2022 走看看