var name = 'name';
var age = 'age'
var obj={
name:'obj'+this.name,
age:'obj'+this.age,
myfun:function(){
console.log(this.name +' '+ this.age);
}
}
function show(){
console.log(this.name);
}
show();//name,指向全局
obj.myfun();//objname,指向obj
obj.myfun.call(db);//dbname指向括号内的对象db
obj.myfun.apply(db);//dbname指向括号内的对象db
obj.myfun.bind(db)();//dbname指向括号内的对象db,返回函数,需要加括号运行
第一个全局声明的函数,this指向window
第二个this指向obj
第三、四、五个this指向括号内参数–db
所以,call(),apply(),bind()可用于改变this的指向;
没有参数时bind()返回一个新的函数,需要调用才能执行,其他的三者没什么不同
下面看看call(),apply(),bind()有参数时的区别
var name = 'name';
var obj={
name:'obj'+this.name,
myfun:function(f,t){
console.log(this.name + ' 来自' +f+' 去往'+t);
}
}
var db = {
name:'dbname'
}
// 传参方式不同
obj.myfun.call(db,'成都','上海'); // dbname 来自成都 去往上海
obj.myfun.apply(db,['成都','上海']); // dbname 来自成都 去往上海
obj.myfun.bind(db,'成都','上海')(); // dbname 来自成都 去往上海
obj.myfun.bind(db,['成都','上海'])();// dbname 来自成都,上海 去往undefined(第一个参数是数组)
由此可见:
call()和bind()的传参方式相同,直接用逗号隔开
apply()略有不同,需要把所有参数放在一个数组中