• 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]);
    

    参考资料

  • 相关阅读:
    【Oracle】求历史表以往记录中最接近给定时间的一批记录
    【Oracle】用check语法限制字段的输入值
    【Oracle】行转列
    【Thymeleaf】如何实现including
    【Javascript】JS dom设置元素的css样式
    MS SQL BackUp Database && Shrink DB Log && SP WHO LOCK
    PHP magic_quotes_gpc的详细使用方法
    [轉載]用PHP的ob_start();控制您的浏览器cache!
    [轉]jQuery选择器 – 属性过滤(Attribute Filters)
    [轉]CSS之自动换行
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/9218695.html
Copyright © 2020-2023  润新知