首先来看三个办法的根本语法:

1.call办法

作用: 是调用函数,专门用于批改办法外部的 this 指向,指定this能够代表谁
例如 fn.call(obj)
意思就是 调用函数fn,并且this指向obj对象

call的应用语法:函数名字.call(对象,参数1,参数2,...);实例: function test(a,b){      console.log(this);      console.log(a + b);  }  test(1,2);  //  window  3  var obj = {name:'zjy'};  window.test.call(obj,3,5);  //  {name:'zjy'} 8

解析:没有应用 call 办法时,test办法的this指向全局对象window,而当应用了call办法后,将test的this指向从window变成了obj对象,而前面的参数则是对应办法的形参程序


2. apply办法

作用: 和call办法一样也是批改办法外部的 this指向的,它们的区别在于apply的第二个参数必须为一个数组(部署了Iterator接口的类数组对象也能够)

// ?apply的应用语法// 函数名字.apply(对象,[参数1,参数2,...]);实例:     function test(a,b){        console.log(this);        console.log(a + b);    }    test(1,2);  //  window  3    var obj = {name:'zjy'};    window.test.apply(obj,[3,5]);  //  {name:'zjy'} 8

解析:没有应用 apply 办法时,test办法的this指向全局对象window,而当应用了apply办法后,将test的this指向从window变成了obj对象,而前面的数组参数则是将数组中元素顺次对应到test办法形参的地位


3. bind办法

作用:扭转this的指向问题, 是绑定函数的this,同时返回绑定后的新函数
例如
var fb = fn.bind(obj);
window.fb();
无论谁调用fb函数, 函数的this都会指向obj

// ?bind的应用语法// 函数名字.bind(对象,参数1,参数2,...);实例:  var obj = {key:"value"}    var foo = function(){        console.log(this)    }    foo.bind(obj)()  //  obj

解析: 解析:在没有应用bind办法时,foo()中的this指向的是全局对象window,而应用了bind办法之后则指向的是obj对象

作用:前两个都是为了扭转this指向,bind是扭转this指向并且复制这个办法返回

总结

apply,call,bind三者的区别 :

1. 三者都能够扭转函数的this对象指向。

2. 三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window。

3. 三者都能够传参,然而apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind能够分为屡次传入。

4. bind 是返回绑定this之后的函数,便于稍后调用;apply 、call 则是立刻执行 。

粗体