(10)JavaScript学习笔记 - 函数

来源:岁月联盟 编辑:exp 时间:2012-07-28

一、定义
[javascript] 
function print(msg) 

    document.write(msg,"<br>"); 

 
function distance(x1,y1,x2,y2) 

    var dx=x2-x1; 
    var dy=y2-y1; 
    return Math.sgrt(dx*dx+dy*dy); 

 
function factorial(x) 

    if(x<=1) 
        return 1; 
    return x*factorial(x-1); 

 
//调用 
print("Hello"+name); 
print("Welcome to my blog"); 
total_dist=distance(0,0,2,1)+distance(2,1,3,5); 
print("The probability of that is:"+factorial(5)/factorial(13)); 
 
//嵌套的函数 
function hypotenuse(a,b) 

    function square(x) 
        { 
            return x*x; 
        } 
    return Math.sqrt(square(a)+square(b)); 

二、可变长度的参数列表:Arguments 对象
[javascript] 
//使用arguments 来验证调用函数时是否使用了正确数目的实际参数 
function f(x,y,z) 

    if(arguments.length!=3) 
    { 
        throw new Error("functon f called with "+arguments.length+"arguments,but it expects 3 arguments."); 
    } 

 
//arguments 可以编写函数使之能够使用任意数目的实际参数 
function max(/*...*/) 

    var m=Number,NEGATIVE_INFINITY; 
    for(var i=0;i<arguments.length;i++) 
    { 
        if(arguments[i]>m) m=arguments[i]; 
    return m; 
    } 

 
var largest=max(1,10,100,2,3,1000,4,5,10000,6); 
//这样的能够接受任意数目的参数被称作可变参数函数 
 
//callee属性,用来引用当前正在执行的函数,可以用来允许对未命名的函数递归地调用自身 
function(x) 

    if(x<=1) return 1; 
    return x*arguments.callee(x-1); 

三、把对象属性用作参数
为了方便调用,使用下面的方法可以允许参数按照任意顺序以名字/值对的方式来传递

[javascript] 
function arraycopy(/*array*/from,/*index*/from_start,/*array*/to,/*index*/to_strart,/*integer*/length) 

    //code goes here 

function easycopy(args) 

    arraycopy( 
            args.from, 
            args.from_start||0, 
            args.to, 
            args.to_start||0, 
            args.length;); 

var a=[1,2,3,4]; 
var b=new Array(4); 
easycopy(from:a,to:b,length:4); 

四、参数类型
[javascript] 
//验证参数类型的函数,如果不能通过则中断执行 
function sum(a) 

    if((a instanseof Array|| 
        (a&&typeof a=="object"&&"length" in a)) 
        { 
            var total=0; 
            for(var i=0;i<a.length;i++) 
            { 
                var element=a[i]; 
                if(!element)continue; 
                if(typeof element=="number") total+=element; 
                else throw new Error("sum():all array elements must be numbers"); 
            } 
            return total; 
        } 
        else throw new Error("sum():argument must be an array"); 

 
//以下函数可以接受任意多个参数,递归处理所有的数组类型的参数,在抛出一个错误之前,尽最大努力地把非数字值转换为数字 
function flexisum(a) 

    var total=0; 
    for(var i=0;i<arguments.length;i++) 
    { 
        var element=arguments[i]; 
        if(!element) continue; 
        var n; 
        swith(typeof element) 
        { 
        case"number": 
            n=element; 
            break; 
        case"object": 
            if(element instanceof Array) 
                n=flexisum.apply(this,element); 
            else n=element.valueof(); 
            break; 
        case "function": 
            n=element(); 
            break; 
        case"string": 
            n=parseFloat(element); 
            break; 
        case"boolean": 
            n=NaN; 
            break; 
        } 
        else throw new Error("sum():can't convert "+element+" to number"); 
    } www.2cto.com
    return total; 


作者:dxh_0829