ECAMScript3给Function的原型定义了两个方法,分别是Function.prototype.call和Function.prototype.apply,他们的作用一模一样,区别仅在于传参方式不同。
共性:
- 产生的效果或作用完全相同;
- 至少有一个参数;
- 第一个参数必须有且是一个对象(Object)。
call和apply区别:
传递参数的方式。用法上不同,主要是参数不同
1、call方法:
call参数数量不固定
与apply相同,第一个参数是指定函数体内this对象的指向,后面的是需要传入被调用函数的参数call实际上是包装在apply上的语法糖。如果我们需要明确的知道函数接收多少个参数,而且想一目了然的表达形参和实参的对应关系,可以用call。
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
var func = function(a, b, c) {
alert([a,b,c]) // 输出[1,2,3]
}
func.call(null,1,2,3)
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
2、apply方法:
apply接收两个参数
第一个参数指定函数体内this对象的指向,第二个参数是数组或者类数组(例如arguments),是传入被调用函数的参数列表。
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
参数
thisObj
可选项。将被用作当前对象的对象。
argArray
可选项。将被传递给该函数的参数数组。
var func = function(a, b, c) {
alert([a,b,c]) // 输出[1,2,3]
}
func.apply(null,[1,2,3])
说明
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
总结:
1 call的语法:函数名.call(obj,参数1,参数2,参数3……);
2 apply的语法:函数名.apply(obj,[参数1,参数2,参数3……]);
这两个东西功能相同,就是把一个函数里面的this设置为某个对象,区别就是后面的参数的语法。call需要使用逗号分隔列出所有参数,但是apply是把所有参数写在数组里面。需要注意的是即使只有一个参数,也必须写在数组里面。