1. 程式人生 > >JS之函式(一)

JS之函式(一)

函式定義

    函式主要分為兩種,其一為常見的函式宣告,其二為函式表示式

1、函式宣告

   function test() {}

講解為:函式的特徵值 function + 函式名() {函式體}

2、函式表示式

(1) 命名函式表示式

              var test = function test(){}

(2) 匿名函式表示式

              var test = function (){}

3、函式中的引數傳遞

(1) 實參

       實參即為實際引數,表示當呼叫函式時,而傳遞的引數

(2) 形參

      形參即為形式引數,表示當定義函式時,所賦予的引數變數形式

(3)案例

         A、案例1
                     

function test(a,b){

                           var res = a + b;

                           console.log(res);

                           console.log(a);

                           console.log(b);

                    }

                     test(1,2);

      該案例為簡單的函式型別,呼叫中傳入的實參為1,2,函式test中a,b代表的是形式引數,形式引數在其函式體中是被隱含著定義,實際上存在一條語句為var a,b;

      如果呼叫函式為test(1),表明a=1,b由於沒有初始化,因此為undefine,所以最後的res是NAN的形式。

    B、案例2
            

                  function test(a,b){

                      if(test.length > arguments.length){

                               console.log("形參多了");

                       }else if(test.length < arguments.length){

                               console.log("實參多了");

                       }else{

                                console.log("相等");

                       }

                     }

                 test(1,2);

    在JS的函式中,存在arguments陣列,該陣列用於將所有的實參存放於一起。且該陣列中的值只與實參有關,同形參的多少沒有關係。

     函式的大小,test.length表示的是形參的個數

     例如function test(a,b,c,d,r){}, 則該函式的大小為5-->test.length=5

      實參的大小表示為arguments.length

 C、案例3

     如果存在一種情況,需要計算所有引數之和,即無論呼叫函式中傳遞多少個值,均需要計算出結果;

      分析:這種情況屬於不定性,因此無法根據傳遞的實參來定義形參的個數,所以考慮用argument陣列來進行計算求和。

                     function test(a,b){

                           var res=0;

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

                                res +=arguments[i];

                                console.log(arguments[i]);

                            }

                          console.log("任意數之和:"+res);

                     }

                   test(1,2,1,1,..);

4、arguments指向
       

            function test(a,b){

                        //隱含語句:var a,b;

                       //隱含語句:arguments = [1,2];

                       a = 3;

                    console.log(arguments[0]); ---->列印值為3

                    //反之,如果將arguments[0]=2,

                    arguments[0]=2;

                     console.log(a);

               }

           test(1,2);

        在該例子中,我們已知曉arguments代表的是將所有的實參接收並存放到陣列中,如果將a的值重新修改,則argument中的值也會隨之發生改變。實際上形參和arguments之間是兩個物件,只是這兩者之間存在一定的關係,即形參會隨著arguments中值的變化而變化,反之同樣如此。

5、練習

      (1) 輸入數字,逆轉並輸出漢字形式

   

          function reverse(){

                 var num = window.prompt("請輸入數字:");

                 var stringData = "";

                 if(num){

                     for(var i=num.length-1;i>=0 ;i--){

                          stringData +=changeChinese(num[i]);

                        }

                     console.log(stringData);

                 }else{

                   alert("請輸入引數:");

                 }
             }


            function changeChinese(num){

                  switch(num){

                      case '1':

                          return '壹';

                      case '2':

                          return '貳';

                      case '3':

                          return '叄';

                      case '4':

                          return '肆';

                      case '5':

                          return '伍';

                     }

               }

               reverse();

 (2) 實現N的階乘

        //階乘計算:例如計算3的階乘 3x2x1=6 

        // n! = n * (n-1)!         0! = 1;
 

              function countN(n){

                     if(n == 1 || n == 0){

                            return 1;

                       }

                return n * countN(n-1);

              }

              console.log(countN(5));