call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同
相同点:两个方法产生的作用是完全一样的
不同点:方法传递的参数不同
call方法:
- 语法:
1 | call([thisObj[,arg1[, arg2[, [,.argN]]]]]) |
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
- 说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
apply方法:
- 语法
1
apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
- 说明: 如果argArray不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传
实例
1.用call实现继承
1 | function Person(name){ |
cat并没有Showname()的方法 ,用call方法实现了继承
2.改变this的指向
1 | var obj1 = { |
call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的.
当参数明确时可用call, 当参数不明确时可用apply给合arguments