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是立即调用;

最新文章

  1. 当泛型方法推断,扩展方法遇到泛型类型in/out时。。。
  2. Windows 10一周年更新正式版官方ISO镜像(1607)
  3. MYSQL 锁机制 分析
  4. tomcat匹配Servlet的流程(原创)
  5. 0511Scrum项目3.0
  6. Spring MVC 指导文档解读(一)
  7. window10 mysql5.7 解压版 安装
  8. php--tp3.2引入sphinx搜索
  9. Android Loader详解
  10. [SQL]SQL语言入门级教材_跟我学SQL(六)
  11. Be quiet
  12. innerHTML与innerText的PK
  13. POJ 2311 Cutting Game(SG+记忆化)
  14. Linux 程序,进程和线程
  15. Model中设置表单验证方法
  16. DSAPI 提取中间文本(字符串)
  17. #032 有空就看PTA
  18. HDU 6348 序列计数 (树状数组 + DP)
  19. mybatis 动态sql 插入报错
  20. 理解ThreadPoolExecutor线程池的corePoolSize、maximumPoolSize和poolSize

热门文章

  1. matlab判断文件或文件夹是否存在
  2. LINUX下SYN攻防战 [转]
  3. js基本语法与变量
  4. 使用H2数据库进行单元测试
  5. 是否编码输出html字符
  6. CSS选择器的组合选择器之后代选择器和子元素选择器
  7. BZOJ 1854: [Scoi2010]游戏 [连通分量 | 并查集 | 二分图匹配]
  8. Android Studio,使用外部模拟器作为生成app调试的模拟器
  9. 如何使用 Bootstrap 搭建更合理的 HTML 结构
  10. gitlab手动安装