• 函数的传值实例(递归,阶乘,排序)


    前一篇简单了介绍了一下函数的传值,知道了函数本身可以当做另外一个函数的参数传递进去。这里在介绍一个函数传值的实例:

    function fn(num1){

             function fn1(num2){

                       return (num2+num1)

             }

    return fn1

    }

    var fn3=fn(20);

    alert(fn3(11));

    alert(fn3);

    这里第一个返回的就是31,第二个返回的是fu的定义函数。

    在这里我么可以这样理解:函数的第一层就是让设置参数的一层,var fn3=fn(20);这里就是申请了一个参数为20的函数,然后再在这个函数的基础之上发挥功能,当然还是利用刚在申请的函数喽。所以要显示的就是fn3(),括号里面的就是第二个参数。

    这样看来,函数在使用过程中需要两个参数的定义。第一个就是最外层的参数,这是后来使用函数的基础。我的理解是用fn3实现了一个特定函数的占位。后来再使用的时候,直接调用占位函数,占位函数也需要一个参数,这个参数就是第二个参数。

    下面总结一下sort函数的使用:

    Sort函数是对字符串进行排序的一个函数,但是在使用过程中还需要注意很多东西。

    var as=[1,3,2,5,6333,9,4];

    as.sort();

    alert(as);

    结果表明,对于sort函数而言,如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

    结果是:

    1,2,3,4,5,6333,9

    很明显,这不是我们想要的结果。

    改进:

    function sortbynum(a,b){

             return (a-b)

    }

    var as=[1,3,2,5,6333,9,4];

    as.sort(sortbynum);

    alert(as);

    这里就会返回正常的顺序。

    下面举一个稍微复杂点的例子:

    这里定义一个Person类,实现类的排序:

    function Person(name,age){

             this.name=name;

             this.age=age

    }

    var person1=new Person("zhou",33);

    var person2=new Person("chen",27);

    var person3=new Person("tian",45);

    var persons=[person1,person2,person3];

    persons.sort(sortbyage);

    function sortbyname(obj1,obj2){

             if(obj1.name>obj2.name)

                       return 1;

             else if(obj1.name<obj2.name)

                       return -1;

             else return 0;

    }

    function sortbyage(obj1,obj2){

             return obj1.age-obj2.age

    }

    function show(){

             var con=document.getElementById("per");

             //alert(con);

             for(var i=0;i<persons.length;i++)

                       con.innerHTML+=persons[i].name+","+persons[i].age+"<br/>";

    }

    show();

    这个部分可以根据sort()括号里面的参数来实现根据name还是age的排序。结果喜人。

    但是这个还不够,这样的话,如果这个类有一百个属性,我们难不成还要写一百个函数然后手动测试咩?

    于是我们可以利用函数传值的原理简化这个过程;

    原理如下,但是还在debug中……

    function sortbyproperty(propertyname){

             alert(propertyname);

             function sortfun(obj1,obj2){

                       if (obj1.propertyname>obj2.propertyname)

                                return 1;

                       else if (obj1.propertyname<obj2.propertyname)

                                return -1;

                       else return 0;

             }

             return sortfun;

    }

    persons.sort(sortbyproperty('age'));

    这个函数足以取代我们原来根据一个属性一个方法的设想,只是在调用的时候,需要Person.sort(sortbypropername(……));来进行调用。

    下面简单说一下函数的几个简单属性arguments和this:

    关于arguments

    function fun(sum){

             alert(arguments.length);

             for(var i=0;i<arguments.length;i++)

                       alert(arguments[i])

    }

    fun(1,2,3,4,5,6);

    arguments可以把所有的参数读取到arguments这个数组里面。有length属性,可以使用arguments[]调用。

    在arguments中,有一个callee属性,js中实现递归基本上就是靠这个属性

    普通递归arguments

    function digui(sum){

             if (sum<=1)

                       return 1;

             else

                       return sum*digui(sum-1)

    }

    alert(digui(99));

    缺陷:

    var fun=digui;

    fun(3);

    digui=null;

    就会报错。因为此时fun这个函数依然使用digui这个函数来调用,但是digui这个函数已经指向null,就会报错。下面解开耦合(利用arguments的callee属性)

    function digui(sum){

             if (sum<=1)

                       return 1;

             else

                       return sum*arguments.callee(sum-1)

    }

    alert(digui(99));

  • 相关阅读:
    Web网站架构演变—高并发、大数据
    企业级Nginx Web服务优化实战
    初始化mysql数据库时提示字符编码错误的解决办法
    linux下logrotate 配置和理解
    Centos 5.2下安装多个mysql数据库
    编译安装 mysql 5.5,运行 cmake报错Curses library not found
    Centos 5.5 编译安装mysql 5.5.9
    理解索引的基数
    centos下yum安装mysql5.6后,无法启动 MySQL Daemon failed to start
    如何从MySQL官方Yum仓库安装MySQL5.6
  • 原文地址:https://www.cnblogs.com/lamian/p/3932984.html
Copyright © 2020-2023  润新知