call apply bind
在JavaScript中,call
、apply
和bind
是Function
对象自带的三个方法,这三个方法的主要作用是改变函数中的this
指向。
call
、apply
、bind
方法的共同点和区别:apply
、 call
、bind
三者都是用来改变函数的this对象的指向的;
apply
、 call
、bind
三者第一个参数都是this要指向的对象,也就是想指定的上下文(函数的每次调用都会拥有一个特殊值——本次调用的上下文(context)——这就是this
关键字的值。);
apply
、 call
、bind
三者都可以利用后续参数传参;
bind
是返回对应函数,便于稍后调用;apply
、call
则是立即调用 。
apply和call作用完全一样,只是接受参数的方式不同,call是一个接一个,apply是数组形式(如果不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError)
a.call(thisObj,arg1,arg2...)
a代表一个方法
thisObj
的取值有以下4种情况:
(1) 不传,或者传null,undefined, 函数中的this指向window对象
(2) 传递另一个函数的函数名,函数中的this指向这个函数的引用
(3) 传递字符串、数值或布尔类型等基础类型,函数中的this指向其对应的包装对象,如 String、Number、Boolean
(4) 传递一个对象,函数中的this指向这个对象
a.call(); //window
a.call(null); //window
a.call(undefined); //window
a.call(1); //Number
a.call(''); //String
a.call(true); //Boolean
a.call(b); //function b(){}
a.call(c); //Object
bind是ES5新增的方法
bind方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()
方法的第一个参数作为 this
,传入 bind()
方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
注意:bind
方法的返回值是函数
调用方式
a.bing(thisObj,arg1,arg2...)() 等价于 var fun = a,bind(thisObj,arg1,arg2...); fun();