• JS-apply-call的使用


    1.call 和 apply 基本知识点

        基本的语法格式:

        Function.apply(obj,[])  第二个参数必须是数组,或者arguments

        Function.apply(obj,args)  

    注意到,call()与apply()的区别:功能一样。第二个参数形式不一样。call传递多个参数,是任意形式。apply第二个参数必须是数组形式。

    用代码来理解它们区别最好:

       例子1:

    function add(a,b){
       alert(a+b);
    }


    function subInfo(a,b){
       alert(a-b);
    }

           add.apply(subInfo,[9,1]) //实际调用的是subInfo的方法;

            add.call(subInfo,9,1)  //实际调用的是subInfo的方法;

     -----上面这个例子有问题;

       例子2

          例子1并没有任何的实际意义,来看例子2吧      

    function person(name,age){
       this.name=name;
       this.age=age;
     }
    person.prototype={         //这个相当于静态方法,被"类"所共有的
       action:function (){
         alert("sleep . eat. fuck.")
       }
    }

    function Animal(type){
        this.type=type;
    }


    var p=new person('阿呆',18);
    p.action();

    //这时候,动物类也想 拥有action 方法,那么就可以以;
    p.action.call(Animal);   //JS 中一切皆对象,函数名称为对象引用。
    var a=new Animal("DOG");
    a.action();
    //作用:动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作
    //聪明的你一定想到了继承;那 我们接着看列子三吧;

     

    例子3

    function person(name,age){
       this.name=name;
       this.age=age;
    }
    person.prototype={
       action:function (){
       alert("sleep . eat. fuck.")
       }
    }

    function student(classID,grade){
        this.classID=classID;
        this.grade=grade;
    // person.call(this,"阿呆",18)  
     person.apply(this,["阿呆",18])  //动态改变this而出现的

    }

          var stu=new student("110",100);
          alert(stu.name); //结果:阿呆;

     

    2.在开发中的实际应用

      实际应用一:

        js面向对象编程中的继承。

      实际应用二:

          求最大,最小值       

          比如  

         alert(Math.max(5,8))   //8  

         alert(Math.max(5,7,9,3,1,6))   //9  

         但是在很多情况下,我们需要找出数组中最大的元素。

         var arr=[5,7,9,1]  

         alert(Math.max(arr))    //   这样却是不行的。一定要这样写  

         通常我们会自定义一个方法

    function getMax(arr){
        var len=arr.length;
        for(var i=0,ret=arr[0];i<len;i++){
        ret=Math.max(ret,arr[i]); //流行数组中最大的一个;
    }
        return ret;
    }

    改进:

    function getMax(arr){

      return Math.max.apply(null,arr)

    }

    //方便快捷,帅,原理就是:这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 

         实际应用三

          Array.prototype.push 可以实现两个数组合并

          var arr1=[1,3,4];

          var arr2=[3,4,5];

           如果我们要把 arr2展开,然后一个一个追加到 arr1中去,最后让 arr1=[1,3,4,3,4,5]  arr1.push(arr2) 显然是不行的。

           因为这样做会得到 [1,3,4, [3,4,5] ]  

           你也可以自定意义一个方法;

           如:

           var len=arr2.length;

            for(var i=0;i<len;i++){

              arr1.push.(arr2[i])

            }

           //不过 自从有了 apply之后;一切如此简单;

          Array.prototype.push.apply(arr1,arr2) 

           

         

     

  • 相关阅读:
    对CSS中的Position、Float属性的一些深入探讨
    npm修改全局包安装路径
    让你彻底地、永久地搞懂JavaScript的==
    看懂此文,不再困惑于javascript中的事件绑定、事件冒泡
    检测字符串是否含有html标签的检测
    使用js的Math.random函数生成n到m间的随机数字
    js禁用键盘回退网页功能,编辑区域的回退除外
    CSS浮动简明小结
    CSS两列布局
    system call test
  • 原文地址:https://www.cnblogs.com/mc67/p/4803063.html
Copyright © 2020-2023  润新知