call,apply和bind的用法和区别


首先来看三个方法的基本语法:

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对象,然后面的参数则是对应方法的形参顺序app


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方法形参的位置this


3. bind方法

做用:改变this的指向问题, 是绑定函数的this,同时返回绑定后的新函数
例如
var fb = fn.bind(obj);
window.fb();
不管谁调用fb函数, 函数的this都会指向objcode

// ?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。io

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

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

粗体

相关文章
相关标签/搜索