apply和call是函数传参的两种方式,但是他们常用的主要功能个人理解认为应该是扩展作用域。
相同之处:都表示调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。等同于B.call(A, args1,args2)。
不同之处:apply只接受两个参数,一个是在其中运行函数的作用域(即this),另一个是参数数组。
而call第一个参数和apply一样都是在其中运行函数的作用域,另一个是参数数列。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj。
补充:
call(this,...参数列表)立即调用
apply(this,[参数数组])立即调用
bind(this,,...可分次传入的参数列表);返回一个永久改变this指向的函数。不是立即执行。若要立即执行:bind(this,...list)()即可
关于bind:
bind()方法在ECMAScript5中新定义的,这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值,该函数可传入两个参数第一个参数作为this,第二个及以后的参数则作为函数的参数调用。具体作用如下:
1、创建绑定函数
就是当我们调用某些函数的时候是要在特定环境下才能调用到,所以我们就要把函数放在特定环境下,就是使用bind把函数绑定到特定的所需的环境下。
2、让函数拥有预设的参数
使用bind()方法使函数拥有预设的初始参数,这些参数会排在最前面,传给绑定函数的参数会跟在它们后面
3、setTineout()的使用
正常情况下,调用setTimeout的时候this会指向全局对象,但是使用类的方法时我们需要指向类的实例,所以要把this,绑定要回调函数方便继续使用实例
4、把类数组转换为数组。
利用call和apply去实现转换。
但是,个人理解,其常用作用是改变this的指向。
javascript方法--bind() - xxxxBW - 博客园
同时,在jQuery中也有bind().