1、 bind
使用
var obj = {id:1,name:'张三'}
function text (num,str) {
console.log(str);//你好
console.log(num);//123
console.log(this)//{id: 1, name: "张三"}
}
text.bind(obj,123,'你好')()
bind不会立刻执行这个函数,要执行的话要再加一个括号
传参
// bind第一个参数是this的指向,之后的参数是向函数内部传参
//下面这两种传参都可以接收到
text.bind(obj,123,'你好')();
text.bind(obj)(123,'你好');
2、apply
使用
var obj = {id:1,name:'张三'}
function text (num,str) {
console.log(str);//你好
console.log(num);//123
console.log(this)//{id: 1, name: "张三"}
}
text.apply(obj,[123,'你好']);
apply会立即执行这个函数
传参
// 第一个参数是this指向,第二个参数是传参,但是传参要写在一个数组里,否则的话会报错
text.apply(obj,[123,'你好']);//成功
text.apply(obj,123,'你好');//报错
text.apply(obj,[123,'你好'],'hello');//第三个参数会被忽略,
3、call
使用
var obj = {id:1,name:'张三'}
function text (num,str) {
console.log(str);//你好
console.log(num);//123
console.log(this)//{id: 1, name: "张三"}
}
text.call(obj,123,'你好');
call会立即执行这个函数
传参
//call的第一个参数是this指向,之后的参数是传参,不会出现apply里的问题,不需要写在数组里
text.call(obj,123,'你好');//成功
4、总结
相同点
1.都可以修改this指向
2.三者第一个参数都是this要指向的对象,但是如果没有传参数或参数为undefined或null,则会指向window。
不同点
1.bind不会立刻执行,会返回绑定this之后的函数,call和apply会立即执行
3.三者都可以传参,但是apply是数组,而call和bind传过去的是一系列参数