日期:2014-05-16  浏览次数:20304 次

JavaScript中call与apply区别
先前使用javascript多是为了表单验证,最多是实现客户端的交互功能。基本不用call、apply之类的难懂方法。
现在流行富客户端了。javascript也越来越对象化了。不得不学习一下!

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

apply方法:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

1、call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。

call([thisObj[,arg1[, arg2[,     [,.argN]]]]])

参数
thisObj

可选项。将被用作当前对象的对象。

arg1, arg2,    , argN

可选项。将被传递方法参数序列。

说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

要求
版本 5.5

请参阅
应用于: Function 对象


2、apply 方法
应用某一对象的一个方法,用另一个对象替换当前对象。

apply([thisObj[,argArray]])

参数
thisObj

可选项。将被用作当前对象的对象。

argArray

可选项。将被传递给该函数的参数数组。

说明
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

要求
版本 5.5

请参阅
应用于: Function 对象


3、call与apply
实际上这两个的作用几乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg参数可以是变量,而apply([thisObj[,argArray]])中的参数为数组集合

4、call 实例
引用
程序代码 程序代码
var obj = new BaseClass();

        DriveClass.call(obj,...);

以上假设 BaseClass和DriveClass是已经声明的类(function),那么执行后obj对象将拥有DriveClass和BaseClass的方法和属性,如果类成员名称存在冲突,那么DriveClass的会覆盖BaseClass的成员。产生的结果和类继承的结果一样


5、 apply实列

引用

程序代码 程序代码
function adApplyDemo(x) { return ("this is never-online, BlueDestiny ’" + x + "’ demo");}
function handleAdApplyDemo(obj, fname, before) { 
var oldFunc = obj[fname]; 
obj[fname] = function() {   
return oldFunc.apply(this, before(arguments)); 
};
}

function hellowordFunc(args) {
args[0] = "hello " + args[0]; 
return args;
}

function applyBefore() {
alert(adApplyDemo("world"));
}

function applyAfter() {
handleAdApplyDemo(this, "adApplyDemo", hellowordFunc);
alert(adApplyDemo("world")); // Hello world!
}