飛翔的起點(diǎn)

          從這里出發(fā)

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          js中的函數(shù)學(xué)習(xí)(一)

          1.函數(shù)

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

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

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

          2.嵌套函數(shù)

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

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

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

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

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

          4.函數(shù)直接量

              函數(shù)直接量是一個(gè)表達(dá)式,它可以定義匿名函數(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ù)時(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ù)直接量有個(gè)重要的有點(diǎn),函數(shù)直接量只被解析和編譯一次,而作為字符串傳遞給Function()構(gòu)造函數(shù)的js代碼則在每次調(diào)用構(gòu)造函數(shù)時(shí)只需要被解析和編譯一次。

          函數(shù)最重要的特性就是他們能夠被定義和調(diào)用,但是在js中函數(shù)并不只是一種語法,還可以是數(shù)據(jù),可以把函數(shù)賦給變量、存儲在對象的屬性中或存儲在數(shù)組的元素中,傳遞給函數(shù)。其實(shí)函數(shù)名并沒有什么實(shí)際意義,它只是保存函數(shù)的變量的名字,可以將這個(gè)函數(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ù)還定義了一個(gè)特殊屬性,

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

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

          6.Arguments對象

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

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

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

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

          e.g 

            function(x){

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

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

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

          除了數(shù)組元素,Arguments對象還定義了callee屬性,用來引用當(dāng)前正在執(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ù)數(shù)目,并且arguments屬性的length只在函數(shù)內(nèi)部起作用,而函數(shù)自身的length屬性它是只讀的,返回的是函數(shù)需要的實(shí)際參數(shù)的數(shù)目,并且函數(shù)的屬性length函數(shù)體的內(nèi)部和外部都在是有效的

          函數(shù)的prototype屬性

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

          函數(shù)自定義屬性

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

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

              他們的第一個(gè)參數(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

          主站蜘蛛池模板: 哈密市| 瑞安市| 临猗县| 汉源县| 南宫市| 沐川县| 瓦房店市| 特克斯县| 南溪县| 南投县| 垦利县| 霍城县| 瓦房店市| 绍兴县| 汉川市| 民权县| 安福县| 峡江县| 湘乡市| 旺苍县| 芦溪县| 大关县| 蒙自县| 正宁县| 临武县| 辽宁省| 尚志市| 南开区| 塔城市| 开封县| 抚顺县| 贵港市| 灌南县| 庄河市| 虞城县| 达日县| 扶余县| 黑河市| 昌邑市| 莒南县| 普宁市|