• JavaScript的函数call和apply的区别、以及bind方法


    1、call和apply的定义和区别

      call和apply的作用一样,唯一不同的是:接受的参数不同。

      apply:方法能够劫持另一个对象的方法,继承另一个对象的属性。

      Funciton.apply(obj,arguments)

      obj:对象,替代Function类里面的this对象

      arguments:数组

      call的用法:

      Function.call(obj,[param1[,param2[,....,param3]]]

      obj:Function类里面的this对象

      params:参数列表

    2、call和apply的用法示例

      //定义一个Animal的类

      function Animal(name,age){

        this.name = name;

        this.age = age;

      }

      //定义一个Cat的类

      function Cat(name,age,kind){

        Animal.apply(this,arguments);  //调用Animal的方法,并将里面的this对象,转化成Cat实例

        this.kind = kind;

      }

      var cat = new Cat("miao",8,"cat");

      call示例,将上面代码变成Animal.call(this,name,age);其他的保持不变,这就是差别。

    3、 什么情况下用apply,什么情况下用call

      在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,

      并且在调用Animal的时候参数的列表是对应一致的(也就是Animal和Cat的参数列表前两位是一致的) 就可以采用 apply ,

       如果我的Animal的参数列表是这样的(age,name),而Cat的参数列表是(name,age,kind),这样就可以用call来实现了,

      也就是直接指定参数列表对应值的位置(Person.call(this,age,name,kind));

    4、 巧用apply 

      apply的一些其他巧妙用法 通过以上示例可以看出apply可以将一个数组默默的解析成一个一个的参数,

      可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) ,

      利用aplly这个特点我们就可以用在一些针对字符串操作的方法了:例如:

      a) Math.max 可以实现得到数组中最大的一项

        因为Math.max参数不支持数组,但是支持Math.max(param1,param2,parma3,....)
      所以var max = Math.max.apply(null,arrary),就可以轻易得到一个数组中最大的一项。
     
         b)Array.prototype.push 可以实现两个数组的合并

      var arr1 = new Array(1,2,3,5,6); 
      var arr2 = new Array(7,8,9,0); 
      Array.prototype.push.apply(arr1,arr2);
      console.log(arr1); // [1, 2, 3, 5, 6, 7, 8, 9, 0]


    5、bind方法:绑定函数内部的this

      末尾略微提一下bind方法,是ES5新出的,它主要是绑定函数内部的this,示例

      window.color = "red";
      var o = { color: "blue" };
      function sayColor(){
        alert(this.color);
      }
      var objectSayColor = sayColor.bind(o);
      objectSayColor();  //blue

      将this绑定在o对象上,改变函数内部的this指向。

      支持bind()方法的浏览器有 IE9+、Firefox 4+、Safari 5.1+、Opera 12+、 Chrome。

    参考链接:

       http://www.cnblogs.com/xiaohongwu/archive/2011/06/15/2081237.html

         https://segmentfault.com/a/1190000004159030

  • 相关阅读:
    正则表达式个人总结(二):正则表达式语法的深入理解第二部分
    正则表达式个人总结(一):正则表达式语法的深入理解第一部分
    JS中的函数(二):函数参数(你可能不知道的参数传递)
    字体属性设置(一):谷歌浏览器12px以下字体的显示;方法和原理
    树莓派4B刷固件卸载ROS包
    Kobuki入门
    locobot快速使用
    AX-18A固件修复失败
    locobot 软件配置
    曾经我认为C语言就是个弟弟
  • 原文地址:https://www.cnblogs.com/cxying93/p/6097704.html
Copyright © 2020-2023  润新知