javascript函数apply的使用和理解

来源:互联网 发布:ubuntu开机花屏 编辑:程序博客网 时间:2024/05/16 18:37

定义

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下输出结果:

obj210

优缺点

apply函数可以在调用函数的时候改变this值和参数,这样我们可以在特定的需求面前应用apply函数。从面向对象的角度来看,这是一种重复利用代码较少冗余的手段。鉴于这个优点,很多javascript库中都会应用apply函数。
然而apply函数的缺点也是比较明显的。在上面的例子中就显现出,代码可读性低,逻辑清晰度不够。在代码重用上,其实可以通过prototype(或者其他原理)实现继承达到相同的效果。与继承的方式在逻辑上和可读性上相比,apply函数就有点为了便捷重用而破坏代码的倾向了(类似于goto语句)。那些大量使用apply函数的javascript库,对于javascript初学者来说就非常晦涩难懂了(实际应用中apply调用的函数的功能远比上面的例子复杂)。

0 0