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

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

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));

原文地址:https://www.cnblogs.com/lamian/p/3932984.html