飛翔的起點

          從這里出發(fā)

          導航

          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統(tǒng)計

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          js中的函數(shù)學習(一)

          1.函數(shù)

              注意:定義函數(shù)時可以使用個數(shù)可變的參數(shù),而且函數(shù)既可以有return語句,也可以沒有return語句;如果函數(shù)不包含return語句,它就只執(zhí)行函數(shù)體中的每條語句,然后返回給調(diào)用者undefined。

              使用運算符typeof來檢測參數(shù)的數(shù)據(jù)類型,使用if(!param)return;來判斷是否存在該參數(shù),因為js是一種無類型語言,所以你不能給函數(shù)的參數(shù)制定一個數(shù)據(jù)類型,而且js也不會檢測傳遞的數(shù)據(jù)是不是那個函數(shù)所需要的類型,如果參數(shù)很重要時,就使用前面介紹的運算符進行檢測。

              不可變參數(shù)js的處理:如果傳遞的參數(shù)比函數(shù)需要的個數(shù)多,那么多余的幾個參數(shù)被忽略掉,如果傳遞的參數(shù)比函數(shù)需要的個數(shù)少,那么多余的幾個參數(shù)就會被賦予undefined,在大多數(shù)情況下,這回使得函數(shù)產(chǎn)生錯誤。

          2.嵌套函數(shù)

              a,函數(shù)定義中可以嵌套其他函數(shù)的定義,但是只能在在頂層全局代碼和頂層函數(shù)代碼中,不能出現(xiàn)在循環(huán)或條件語句中,并且這些限制只應用于由function語句聲明的函數(shù),函數(shù)直接量可以出現(xiàn)在任何js表達式中。

          3.Function()構(gòu)造函數(shù)

              可以使用Function()構(gòu)造函數(shù)和new運算符動態(tài)地定義函數(shù), var f = new Function("x","y","return x*y;");它等價于:function f(x,y){return x*y;}

              Function構(gòu)造函數(shù)可以接受任意多個字符串參數(shù),它的最后一個參數(shù)是函數(shù)的主體,其中可以包含任何js語句,語句之間用分號分隔。由于傳遞給構(gòu)造函數(shù)Function()的參數(shù)中沒有一個用于說明它要創(chuàng)建的函數(shù)名,用Function()構(gòu)造函數(shù)創(chuàng)建的未命名函數(shù)有時被稱作為“匿名函數(shù)”。

              Function()函數(shù)存在的意義:因為Function()構(gòu)造函數(shù)允許我們動態(tài)地建立和編譯一個函數(shù),它不會將我們限制在function語句預編譯的函數(shù)體中;另一個原因是它能將函數(shù)定義為js表達式的一部分,而不是將其定義為一個語句;缺點是:這樣做每次調(diào)用一個函數(shù)時,F(xiàn)unction()構(gòu)造函數(shù)都要對它進行編譯,

          4.函數(shù)直接量

              函數(shù)直接量是一個表達式,它可以定義匿名函數(shù)。

              function f(x){return x*x;}                  //function語句

              var f = new Function("x","return x*x;");    //Function()構(gòu)造函數(shù)

              var f = function(X){return x*x;};           //函數(shù)直接量

              雖然函數(shù)直接量創(chuàng)建的是未命名函數(shù),但是它的語法也規(guī)定它可以指定函數(shù)名,這在編寫調(diào)用自身的遞歸函數(shù)時特別的有用,e.g

          var f= function fact(x){if(x<=1)return 1; else return x*fact(x-1);}

          總結(jié):function()函數(shù)可以任意的使用,具有通用性,F(xiàn)unction()函數(shù)和函數(shù)直接量具有很多的相似性,他們都是未命名函數(shù)(函數(shù)直接量可以有函數(shù)名,尤其是在子調(diào)用函數(shù)中),函數(shù)直接量有個重要的有點,函數(shù)直接量只被解析和編譯一次,而作為字符串傳遞給Function()構(gòu)造函數(shù)的js代碼則在每次調(diào)用構(gòu)造函數(shù)時只需要被解析和編譯一次。

          函數(shù)最重要的特性就是他們能夠被定義和調(diào)用,但是在js中函數(shù)并不只是一種語法,還可以是數(shù)據(jù),可以把函數(shù)賦給變量、存儲在對象的屬性中或存儲在數(shù)組的元素中,傳遞給函數(shù)。其實函數(shù)名并沒有什么實際意義,它只是保存函數(shù)的變量的名字,可以將這個函數(shù)賦給其他的變量,它仍然以相同的方式起作用,

          e.g    function square(x){x*x;}

          var a = square(4);

          var b = square;//這種情況下b引用的函數(shù)和square的作用相同

          var c = b(5);

          除了賦給全局變量之外,還可以將函數(shù)賦給對象的屬性,這是稱函數(shù)為方法;也可以賦給數(shù)組元素。

          e.g

              var a =  new Object;     var a = new Object();

              a.square = new Function("x","return x*x";);

              y = o.square(16);

          e.g   

              var a = new Array(3);

              a[0] = function(x){return x*x;};

              a[1] = 20;

              a[2] = a[0](a[1]);

              除這些之外,如何將函數(shù)作為參數(shù)傳遞給其他函數(shù),

          e.g

          function  add(x,y){return x+y;}

          function subtract(x,y){return x-y;}

          function multiply(x,y){return x*y;}

          function dibide(x,y){return x/y;}

          function operate(operator,operand1,operand2){

              return operator(operand1,operand2);

          }

          var i = operate(add,operate(add,2,3),operate(multiply,4,5));

          var operators = new Object();

          operators["add"] = function(x,y){return x+y;}

          operators["multiply"] = function(x,y){return x*y;}

          operators["divide"] = function(x,y){return x/y;}

          operators["pow"] = Math.pow;

          function operate2(op_name,operand1,operand2){

              if(operators[op_name] == null)return "unknow operator";

              else    return operators[op_name](operand1,operand2);

          }

          var j = operate2('add',"hello",operate2("add","","world"));

          var k = operate2('pow',10,2);

          5.函數(shù)的作用域,調(diào)用對象

              函數(shù)的作用域中除了全局變量、函數(shù)內(nèi)部的局部變量和形式參數(shù)外,函數(shù)還定義了一個特殊屬性,

              arguments,這個屬性應用了另外一個特殊的對象-----Arguments對象,因為arguments屬性是調(diào)用對象的一個屬性,所以它的狀態(tài)和局部變量以及函數(shù)的形式參數(shù)是相同的。

              所以arguments標識符被看做是保留字,不能將它作為變量名或形式參數(shù)名。

          6.Arguments對象

              arguments它具有特殊的意義,是調(diào)用對象的一個特殊屬性,用來引用Arguments對象,Arguments對象就像數(shù)組,可以按照數(shù)字獲取傳遞給函數(shù)的參數(shù)值,但是它并非真正的Array對象。

              arguments具有l(wèi)ength屬性,

              可以使用arguments來檢測調(diào)用函數(shù)使用了正確數(shù)目的實際參數(shù),

          注意:arguments并非真正的數(shù)組,它是一個Arguments對象,Arguments對象有一個非同尋常的特征,當函數(shù)具有命名了的參數(shù)時,Arguments對象的數(shù)組元素是存放函數(shù)參數(shù)的局部變量的同義詞。

          e.g 

            function(x){

              alert(x);  //顯示參數(shù)的初始值

              arguments[0] = null;//改變數(shù)組預算也會改變x

              alert(x);  //現(xiàn)在顯示為“null”

          除了數(shù)組元素,Arguments對象還定義了callee屬性,用來引用當前正在執(zhí)行的函數(shù),這對未命名的函數(shù)調(diào)用自身非常有用。

          e.g

           function(x){

              if(x<-1)return 1;

              return x*arguments.callee(x-1);

          }

          7.函數(shù)的屬性和方法

              由于函數(shù)是對象,所以它具有數(shù)據(jù)和方法。

          函數(shù)的length屬性

              函數(shù)的屬性length和arguments屬性的length不同,arguments數(shù)組的length屬性指定了傳遞給該函數(shù)的實際參數(shù)數(shù)目,并且arguments屬性的length只在函數(shù)內(nèi)部起作用,而函數(shù)自身的length屬性它是只讀的,返回的是函數(shù)需要的實際參數(shù)的數(shù)目,并且函數(shù)的屬性length函數(shù)體的內(nèi)部和外部都在是有效的

          函數(shù)的prototype屬性

              每個函數(shù)都有一個prototype屬性,它引用的是預定義的原型對象,原型對象在使用new運算符把函數(shù)作為構(gòu)造函數(shù)時起作用。

          函數(shù)自定義屬性

              有時候定義全局變量比較亂,可以通過自定義函數(shù)屬性來解決

          函數(shù)的apply()和call()方法

              他們的第一個參數(shù)都是要調(diào)用的函數(shù)的對象,在函數(shù)體內(nèi)這一參數(shù)是關(guān)鍵字this的值,call()的剩余參數(shù)是傳遞給要調(diào)用的函數(shù)的值,apply()的剩余參數(shù)是由數(shù)組指定的參數(shù)。

          posted on 2009-03-21 12:45 forgood 閱讀(1097) 評論(0)  編輯  收藏 所屬分類: javaScript

          主站蜘蛛池模板: 临江市| 宣化县| 鹰潭市| 积石山| 浪卡子县| 上蔡县| 酒泉市| 孝义市| 新建县| 宾阳县| 南投市| 和政县| 沙雅县| 博野县| 合水县| 屯门区| 巴中市| 宁乡县| 黎川县| 扶余县| 城市| 兴海县| 衡东县| 讷河市| 东乡族自治县| 高雄县| 石台县| 基隆市| 公安县| 张家川| 林甸县| 大荔县| 扎鲁特旗| 泸西县| 沧州市| 建瓯市| 沾化县| 丘北县| 永仁县| 于田县| 霸州市|