java學(xué)習(xí)

          java學(xué)習(xí)

           

          js函數(shù)

          一、function概述

             javascript中的函數(shù)不同于其他的語言,每個(gè)函數(shù)都是作為一個(gè)對(duì)象被維護(hù)和運(yùn)行的。通過函數(shù)對(duì)象的性質(zhì),可以很方便的將一個(gè)函數(shù)賦值給一個(gè)變量或者將函數(shù)作為參數(shù)傳遞。

             函數(shù)對(duì)象與其他用戶所定義的對(duì)象有著本質(zhì)的區(qū)別,這一類對(duì)象被稱之為內(nèi)部對(duì)象。內(nèi)置對(duì)象的構(gòu)造器是由JavaScript本身所定義的。

          二、function對(duì)象的創(chuàng)建

          在JavaScript中,函數(shù)對(duì)象對(duì)應(yīng)的類型是Function,可以通過new Function()來創(chuàng)建一個(gè)函數(shù)對(duì)象,也可以通過function關(guān)鍵字來創(chuàng)建一個(gè)對(duì)象。

              //使用new Function()方式創(chuàng)建

              var myFunction=new Function("a","b","return a+b");

              //使用function關(guān)鍵字創(chuàng)建

              function myFunction(a,b) {

                return a + b;

              }

             用關(guān)鍵字創(chuàng)建對(duì)象的時(shí)候,在解釋器內(nèi)部,就會(huì)自動(dòng)構(gòu)造一個(gè)Function對(duì)象,將函數(shù)作為一個(gè)內(nèi)部的對(duì)象來存儲(chǔ)和運(yùn)行。從這里也可以看到,一個(gè)函數(shù)對(duì)象 名稱(函數(shù)變量)和一個(gè)普通變量名稱具有同樣的規(guī)范,都可以通過變量名來引用這個(gè)變量,但是函數(shù)變量名后面可以跟上括號(hào)和參數(shù)列表來進(jìn)行函數(shù)調(diào)用。

              new Function()的語法規(guī)范如下:

              var funcName=new Function(p1,p2,...,pn,body);

            參數(shù)的類型都是字符串,p1到pn表示所創(chuàng)建函數(shù)的參數(shù)名稱列表,body表示所創(chuàng)建函數(shù)的函數(shù)體語句,funcName就是所創(chuàng)建函數(shù)的名稱。可以不指定任何參數(shù)創(chuàng)建一個(gè)空函數(shù),不指定funcName創(chuàng)建一個(gè)匿名函數(shù)。

            需要注意的是,p1到pn是參數(shù)名稱的列表,即p1不僅能代表一個(gè)參數(shù),它也可以是一個(gè)逗號(hào)隔開的參數(shù)列表,例如下面的定義是等價(jià)的:

            new Function("a", "b", "c", "return a+b+c")

            new Function("a, b, c", "return a+b+c")

            new Function("a,b", "c", "return a+b+c")

             函數(shù)的本質(zhì)是一個(gè)內(nèi)部對(duì)象,由JavaScript解釋器決定其運(yùn)行方式。并且可直接在函數(shù)聲明后面加上括號(hào)就表示創(chuàng)建完成后立即進(jìn)行函數(shù)調(diào)用,例如:

              var i=function (a,b){

              return a+b;

            }(1,2);

            alert(i);

             這段代碼會(huì)顯示變量i的值等于3。i是表示返回的值,而不是創(chuàng)建的函數(shù),因?yàn)槔ㄌ?hào)“(”比等號(hào)“=”有更高的優(yōu)先級(jí)。

          三、匿名函數(shù)和有名函數(shù)的區(qū)別

             匿名函數(shù)必須先定義后調(diào)用,有名函數(shù)可以先調(diào)用,后定義。

          A)匿名(這段語句將產(chǎn)生func未定義的錯(cuò)誤)

             <script>

                func();

                var func = function() {

                  alert(1);

                }

             < /script>

          B)有名(輸出1)

             <script>

                func();

                 function func() {

                  alert(1);

                }

             < /script>

          這是因?yàn)镴S解釋器是分段分析執(zhí)行的。并且,在同一段中,有名函數(shù)會(huì)優(yōu)先被分析。并且同名函數(shù)后面的覆蓋前面的。

          而且,下面這段代碼也是合法的:

          <script>

          function myfunc ()
              {
                  alert("hello");
              };
              myfunc(); //這里調(diào)用myfunc,輸出yeah而不是hello
            
              function myfunc ()
              {
                  alert("yeah");
              };  
              myfunc(); //這里調(diào)用myfunc,輸出yeah

          </script>

          如果要讓上述代碼的第一次調(diào)用輸出“hello”,可以將它們分為兩段:

          <script>

          function myfunc ()
              {
                  alert("hello");
              };
              myfunc(); //這里調(diào)用myfunc,輸出hello
          < /script>

          <script>
              function myfunc ()
              {
                  alert("yeah");
              };  
              myfunc(); //這里調(diào)用myfunc,輸出yeah

          </script>

          下面的代碼輸出“hello”

          <script>

          function myfunc ()
              {
                  alert("hello");
              };
          < /script>

          <script>

          myfunc(); //輸出“hello”

          </script>

          <script>
              function myfunc ()
              {
                  alert("yeah");
              };

          </script>

          下面的代碼輸出“yeah”

          <script>

          function myfunc ()
              {
                  alert("hello");
              };
          < /script>

          <script>
              function myfunc ()
              {
                  alert("yeah");
              };

          </script>

          <script>

          myfunc(); //輸出“yeah”

          </script>

          從上面對(duì)段的位置變化導(dǎo)致輸出變化很清楚的解釋了JS解釋器分段分析執(zhí)行的本質(zhì)。

          posted on 2013-01-18 13:11 楊軍威 閱讀(205) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 合川市| 土默特右旗| 深泽县| 东乌珠穆沁旗| 夏邑县| 平乐县| 历史| 南安市| 夹江县| 湟中县| 静海县| 白山市| 乐平市| 荆门市| 祁东县| 南乐县| 洛扎县| 汕头市| 光山县| 准格尔旗| 四子王旗| 兴海县| 文登市| 七台河市| 威宁| 邵东县| 大港区| 莱州市| 健康| 遵义县| 湾仔区| 湘潭县| 定边县| 乌兰察布市| 怀安县| 梓潼县| 临沧市| 阿拉尔市| 土默特右旗| 林芝县| 塘沽区|