1.call()、apply()、bind()这三个方法均可改变this的指向
可以看下面的例子:
var name = '小王',age= 16;
var obj = {
name: '小张',
objAge: this.age,
myFun: function(){
return this.name+"年龄"+this.age;
}
}
var db = {
name: '小明',
age: 22
}
console.log(obj.objAge); //16
console.log(obj.myFun()); // 小张年龄undefined
console.log(obj.myFun.call(db)); //小明年龄22
console.log(obj.myFun.apply(db)); //小明年龄22
console.log(obj.myFun.bind(db)()); //小明年龄22
// bind 执行需要再带一个小括号 是执行操作
可以看到,在未添加这三个方法前:obj内年龄属性没有值,this指向的是obj,因为obj没有值,所以是undefined。
在添加了三个方法后,可以看到获取数据的指向均发生改变。
2.call 、bind 、 apply 传参情况
var obj = {
name: '小张',
objAge: this.age,
myFun: function(fm, to){
return this.name+"年龄"+this.age ,"来自"+fm + "去往"+to;
}
}
var db = {
name: '小明',
age: 22
}
console.log(obj.myFun.call(db,'成都','上海')); //小明 年龄 22 来自 成都去往上海
console.log(obj.myFun.apply(db,['成都','上海'])); //小明 年龄 22 来自 成都去往上海
console.log(obj.myFun.bind(db,'成都','上海')()); //小明 年龄 22 来自 成都去往上海
console.log(obj.myFun.bind(db,['成都','上海'])()); //小明 年龄 22 来自 成都,上海去往undefined
从上面四个结果不难看出
call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:
call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' );
apply的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ]);
bind除了返回是函数以外,它 的参数和call 一样。
当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等!
bind()方法
this.name="jack";
var demo={
name:"rose",
getName:function(){return this.name;}
}
console.log(demo.getName());//输出rose 这里的this指向demo
var another=demo.getName;
console.log(another())//输出jack 这里的this指向全局对象
//运用bind方法更改this指向
var another2=another.bind(demo);
console.log(another2());//输出rose 这里this指向了demo对象了
js bind的多次绑定只有第一次是有效的
var getname = function(){console.log(this.name)};
var m = getname.bind({name:'q1'}).bind({name:'q2'});
m(); // q1