js中的函數function
js的function對象在調用過程中具有一個arguments的屬性,它是由指令碼解譯器建立的(這也是arguments建立的唯一方式)。arguments屬性可以看作是一個Array對象,它有length屬性,可以通過序號訪問每一個參數,而且通過argument的callee屬性可以擷取對正在執行的Function對象的引用。如下:
function factorial(n){ if(n<=n){ return 1; }else{ return n*arguments.callee(n-1); }}alert(factorial(5));
上面使用了callee屬性完成了一個遞迴的演算法。
Function的另一個屬性是caller,它指向正在調用當前函數的父函數對象。利用callee和caller屬性,可以很容易實現對堆棧的遍曆,如:
function fool(v1){ foo2(v1,v2,v3);}function foo2(v1,v2){ foo3(v1,v2,v2*v2);}function foo3(v1,v2,v3){ var foo=argument.callee; while(foo&&(foo!=window)){ document.writeln('
調用參數:
','-------------------------------
'); var args=foo.argument;argn=args.length; for(var 1=0;i'); } document.writeln('
'); foo=foo.caller; }}foo(5);
Function是js中一個很特殊的對象,其特殊體現在他的多重身份上,如:
//function作為類的聲明和實現function ClassA(){ this.prop1="prop1"; this.prop2="prop2";}//function作為建構函式var obj=new CalssA();//輸出true,function作為類引用alert(obj instanceof CalssA);
Function可以聲明普通函數,這和其他語言的概念是一樣的,但Function還可以用於類的聲明和實現,對象的建構函式以及類的引用。上面的代碼中通過function關鍵字聲明了ClassA類,並通過this關鍵字聲明了兩個屬性prop1和prop2,然後在建立obj對象時,ClassA()由起到了物件建構函數的作用;最後代碼中使用instanceof關鍵字判斷obj對象是否是ClassA類的執行個體,此時ClassA又起到了類引用的作用。