Bind、Apply、Call三者的区别

1)bind与apply、call 的最大区别就是:bind不会立即调用,其他两个会立即调用
  var fn = { 
    _int: function(){return 3},
    fun: function(){
      $(id).click(function() {
        console.log(this._int())
      }).bind(this);
    }
  }
2)apply和call的区别
语法: function.apply(thisObj, [obj1,obj2,obj3,...]);
   function.call(thisObj, obj1,obj2,obj3,...);
定义:调用对象的一个方法用另一个对象替换当前对象
共同点:都能改变函数的对象上下文
不同点:
  apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。
  call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj

用法:
1》基本用法:
  function add(a,b) {return a+b;};
  function sub(a,b) {return a-b;};
  var a1 = add.apply(sub, [4,2]);
  var a2 = sub.apply(add, [4,2]);
  //var a1 = add.call(sub,4,2);
  //var a2 = sub.call(add,4,2);
  console.log(a1) 6
  console.log(a2) 2
2>实现继承
  function Animal(name){
    this.name = name;
    this.showName = function(){
      alert(this.name);
    }
  }
  function Cat(name){
    Animal.apply(this,[name]);
  }
  var cat = new Cat("咕咕");
  cat.showName();
  /*call的用法*/
  Animal.call(this,name);
3》多重继承
  function Class10(){
    this.showSub = function(a,b){
      alert(a - b);
    }
  }
  function Class11(){
    this.showAdd = function(a,b){
      alert(a + b);
    }
  }
  function Class12(){
    Class10.apply(this);
    Class11.apply(this);
    // Class10.call(this);
    //Class11.call(this);
  }
  var c2 = new Class12();
  c2.showSub(3,1); //2
  c2.showAdd(3,1); //4

4>apply的一些其他巧妙用法
  a: 求数组中的最大项
    var arr = [1,3,5,7,9,3,4,55,33];
    var max = Math.max.apply(null, arr);
    console.log(max);
  b: 求数组中的最小项
    var min = Math.min.apply(null, arr);
    console.log(min);
  c: 合并两个数组并返回新数组的长度
    var arr1 = new Array("1","3","5","7","9");
    var arr2 = new Array("2","4","6","8");
    console.console(Array.prototype.push.apply(arr1, arr2));

小结:三个的使用区别
都是用来改变函数的this对象的指向的;
第一个参数都是this要指向的对象;
都可以利用后续参数传参;
bind是返回对应函数,便于稍后调用,apply、call是立即调用;

 

posted @ 2018-03-06 16:20  麦芽无心  阅读(373)  评论(0编辑  收藏  举报