call、apply、bind之间的区别

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传过去的是一系列参数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。