前一篇简单了介绍了一下函数的传值,知道了函数本身可以当做另外一个函数的参数传递进去。这里在介绍一个函数传值的实例:
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));