javascript中的call, apply

    jwolf 
1093  0  0   2016-1-20 13:24


我们可以将call()和apply()看成是某个对象的方法,通过调用方法的形式来间接调用函数。call()和apply()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获取它的引用。比如: 想要以对象o的方法来调用函数f(),可以这样使用:

f.call(o);

或者

f.apply(o);

程序实现的功能和以下程序类似:

o.m=f;
o.m();
delete o.m

在ECMAScript 5的严格模式中,call()和apply()的第一个实参都会变成this的值,哪怕传入的实参是原始值甚至是null或者udefined.在ECMAScript 3和非严格模式中,传入null和undefined都会被全局对象代替,而其他原始值则会被相应的包装对象所替代。

对于call(),第一个调用上下文实参之后的所有实参就是要传入待调用函数的值。如:

f.call(o,1,2);

而对于apply:

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

如果一个函数的实参可以是任意数量,使用apply()会相当方便,比如查找一个数组中的最大值:

var biggest = Math.max.apply(Math,your_array);

需要注意的是,传入apply()的参数数组可以是类数组对象也可以是真实数组。实际上,可以将当前函数的arguments数组直接传入另一个函数的apply()来调用另一个函数:

function trace(o,m){
    var original = o[m];
    o[m]= function(){
        console.log("Before called ",m);
        var result = original.apply(this,arguments);
        console.log("After called ",m);
        return result;
    }
}