之前一直搞不懂这三种的用法,结果今天看到一篇文章,惊为天人,终于搞懂了,原文链接
看下面几个例子,包你完全理解
例1:
var name='Mike',age=17;
var obj={
age:19,
name:"Lily",
objAge:this.age,
myFun:function(){
console.log(this.name+"年龄"+this.age);
}
}
obj.objAge;//17
obj.myFun();//Lily 年龄 undefined
例2:
var name='Mike'
function show(){
console.log(this.name);
}
show()//Mike
比较这两个例子this的区别,第一个objAge的this指向的是window,myFun中的this指向的是obj;第二个全局声明的show()函数的this指向的是window
1.call()、apply()、bind()都是用来重新定义this指向的
如:
var name='Mike',age=17;
var obj={
age:19,
name:"Lily",
objAge:this.age,
myFun:function(){
console.log(this.name+"年龄"+this.age);
}
}
var db={
name:'KK',
age:99
}
obj.myFun.call(db)//KK 年龄 99
obj.myFun.apply(db)//KK 年龄 99
obj.myFun.bind(db)()//KK 年龄 99
以上除了因为bind后面多了一个()外,结果返回都一致
因为bind返回的是一个新函数,必须调用它才会被执行
2.传参
var name='Mike',age=17;
var obj={
age:19,
name:"Lily",
objAge:this.age,
myFun:function(fm,t){
console.log(this.name+"年龄"+this.age,"来自"+fm+"去往"+t);
}
}
var db={
name:'KK',
age:99
}
obj.myFun.call(db,"成都","上海")//KK年龄99来自成都去往上海
obj.myFun.apply(db,['成都','上海'])//KK年龄99来自成都去往上海
obj.myFun.bind(db,'成都','上海'])()//KK年龄99来自成都去往上海
obj.myFun.bind(db,['成都','上海'])();//KK年龄99来自成都,上海去往undefined
从上面的例子可以看出call和bind的参数是直接传的,用逗号分隔,如果像第四个例子,用数组传,那个数组只代表一个参数
apply则不同,就是传一个数组,数组中包含所有的参数
然后,三者的参数都不限定是什么类型