共同点:都是用来改变this环境。
bind和 apply,call不同点:
执行机制不同。
bind绑定是返回一个新的函数的,这个新函数的内容是原函数的内容,this是bind绑定的this环境。不执行原函数。
如:function fn(a,b,c)={}; var fn2 = fn.bind({ a:1,b:2 });
apply和call是在原函数执行时,动态改变this环境。
apply和call
相同点:第一个参数都是要绑定的this环境变量。
不同点:
参数不同。
apply 最多两个参数,第二个参数是个数组,里面存放原函数的参数。
如:function fn(a,b,c)={}; fn.apply( this, [ a,b,c ] );
call 可以有多个参数,除了第一个参数,其他都是原函数的参数。
如:function fn(a,b,c)={}; fn.call( this, a, b, c );
总结:改变函数的执行环境,相当于函数在新的环境中从新运行或者定义。bind是在新环境中定义,并且返回一个新函数。apply和call是在新环境中执行,继承就是利用这个特性来实现的,在其他类中使用现有类的函数构造自己的内部环境。
如:
function
A
(
name
){
this
.
name
=
name
;
this
.
fn
=
function
(){
console
.
log
(
this
);
}
}
function
B
(
str
){
A
.
call
(
this
,
str
);
}
var
b
=
new
B
(
'xiaoming'
);
b
.
fn
();
call的作用:在B的执行上下文中执行一遍A操作