bind,apply,call三者的区别
apply方法
apply接收两个参数,第一个参数是this的指向,第二个参数是函数接收的参数,以数组的方式传入。
示例:
回调函数绑定this指向:
var name="张三";
var obj={
name:"李四",
fun:function(time,addr){
console.log(this.name+" is "+time+" born from "+addr);
}
};
var fun=obj.fun;
setTimeout(function(){
fun.apply(obj,["1995","中国"])
} ,0); //李四 is 1995 born from 中国,this改变指向了obj
fun("1996","中国") //张三is 1996 born from 中国,this指向window,说明apply只是临时改变一次this指向
call方法
和apply方法类似,也是临时改变一次this指向,第一个参数也是this指向,后面传的参数跟apply有所不同,apply传的是数组,call方法传的是参数列表。
var name="张三";
var obj={
name:"李四",
fun:function(time,addr){
console.log(this.name+" is "+time+" born from "+addr);
}
};
var fun=obj.fun;
setTimeout(function(){
fun.call(obj,"1995","中国")
} ,0); //李四 is 1995 born from 中国,this改变指向了obj
fun("1996","中国") //张三 is 1996 born from 中国,this指向window,说明call只是临时改变一次this指向
bind方法
第一个参数也是this指向,后面传的参数跟call方法一样传的是参数列表。
bind方法返回的是一个修改过后的函数。
var a = {
user:"张三",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
var c = b.bind(a);
console.log(c); //function() { [native code] }这时候打印不出来user的 ,打印出来是个函数
调用函数c试试呢
var a = {
user:"张三",
fn:function(a,b,c){
console.log(this.user);
console.log(a,b,c);
}
}
var b = a.fn;
var c = b.bind(a,10,11,12);
console.log(c); //function() { [native code] }这时候打印不出来user的 ,打印出来是个函数
console.log(c()); //function() 这时候可以看看打印出来没有