在JS中,call()方法和apply()方法到底该怎么应用?

JavaScript016

在JS中,call()方法和apply()方法到底该怎么应用?,第1张

1.apply与call是更改对象的内部指针,即改变对象的this指向的内容;

2.call与apply的第一个参数都是要传入给当前对象的对象,及函数内部的this,后面的参数都是传递给当前对象的参数。

详细用法如下:

1.call()

语法:obj1.call(obj2[,param1,param2,...]);

定义:用obj2对象来代替obj1,调用obj1的方法。即将obj1应用到obj2上;

说明:call 方法可以用来代替另一个对象调用一个方法,call 方法可将一个函数的对象上下文从初始的上下文改变为由 obj2 指定的新对象,如果没有提供 obj2参数,那么 Global 对象被用作 obj2。

2.apply()

语法:obj1.call(obj2[,arrArg]);

定义:用obj2对象来代替obj1,调用obj1的方法,即将obj1应用到obj2上,

说明:call ()和apply()作用一样,但是call()可以接收任何类型的参数,而apply()只能接收数组参数。

3.基本用法

4.继承特性

先说区别call和apply的参数不同,前者是call(a,b,c,...)吧所有的参数都传递。后者apply只传递两个参数apply(a,b),其中b是一个数组。这是两者最大的不同,在于后者传递的是一个数组。在大多数情况下,两个函数可以相互替换的。你可以把apply当作call的糖衣写法。就好像js里面循环函数你可以用for也可以用while 一样。call和apply不是一定要怎么用的。

但是有时候apply更有用一些,比如我们需要传递一些不知道多少个数量的参数,就没法用call,而因为apply传递的是个数组,数组就比较容易适配各种参数的数量。

然后,说一说这两个函数的作用,调用一个对象的一个方法,以另一个对象替换当前对象。 这是比较书面的说法,比如:a.call(b),实际上执行的是在a的领域里执行b。有点绕是不是,这里就涉及到一个作用范围的问题,在全局范围下的确可以这样用,但是在面向对象的概念中。如果a是一个对象,而b是另一个对象,那么b中没有a的方法,如何能执行b的方法呢?通过a.call(b),就让b去执行了a的方法。很神奇吧,但是,一般用不上啦,不懂就不懂吧,当你写复杂一些的js插件和比较复杂的类的的时候,就很有用啦。