定义
javascript中有个非常重要的函数:apply(),apply()方法在指定this值和参数(参数以数组或者类数组对象的形式存在)的情况下调用某个函数,意思是它可以改变一个函数的执行环境。
语法
fun.apply(thisArg[, argsArray])
参数
thisArg
在fun函数运行时指定的this值。需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定null或undefined时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。
argsArray
一个数组或者类数组对象,其中的数组元素作为单独的参数传给fun函数。如果该参数为null或undefined,则表示不传入任何参数。从ECMAScript 5开始可以使用类数组对象。
用法
在调用一个存在的函数时,你可以为其指定一个this对象。this指当前对象,也就是正在调用这个函数的对象。使用apply,你可以只写一次这个方法,然后在另一个对象中继承它,而不用在新对象中重复写该方法。
举个简单的例子。
var obj1 = {
objName: 'obj1',
fun: function(val) {
console.log(this.objName);
console.log(val);
}
};
var obj2 = {
objName: 'obj2'
};
obj1.fun.apply(obj2, [10]);
chrome下输出结果:
obj2
10
优缺点
apply函数可以在调用函数的时候改变this值和参数,这样我们可以在特定的需求面前应用apply函数。从面向对象的角度来看,这是一种重复利用代码较少冗余的手段。鉴于这个优点,很多javascript库中都会应用apply函数。
然而apply函数的缺点也是比较明显的。在上面的例子中就显现出,代码可读性低,逻辑清晰度不够。在代码重用上,其实可以通过prototype(或者其他原理)实现继承达到相同的效果。与继承的方式在逻辑上和可读性上相比,apply函数就有点为了便捷重用而破坏代码的倾向了(类似于goto语句)。那些大量使用apply函数的javascript库,对于javascript初学者来说就非常晦涩难懂了(实际应用中apply调用的函数的功能远比上面的例子复杂)。