欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript 面向?qū)ο缶幊?nbsp; function是方法(函數(shù))

 更新時間:2009年09月17日 23:25:46   作者:  
在進(jìn)行編程時,必免不了要碰到復(fù)雜的功能。初學(xué)者最怕復(fù)雜的功能,因為不能夠很好的進(jìn)行功能邊界劃分,只能一大串if、循環(huán)加case堆疊在一起,結(jié)果出來的程序自己看著暈,別人看著更暈。
好程序不是寫給computer的,而是寫給human的。遇到復(fù)雜功能,應(yīng)該想著把它簡化、組件化,把小功能封裝成小組件,小功能塊可以任意的組合得到千變?nèi)f化的復(fù)雜功能。function就可以幫助我們把功能進(jìn)行封裝。那什么是封裝呢。要我說,只要把具體實現(xiàn)給打包,對外提供調(diào)用接口那就是封裝,方法也好、類也好就做了這些事。

      javascript中的function可以用來創(chuàng)建方法、也可以用來創(chuàng)建類,實際上我們可以認(rèn)為是用function來模擬出的類(說到類一般都會要去了解閉包的知識)。還是先看一下方法吧。

       javascript函數(shù)分為有名函數(shù)、匿名函數(shù)和在匿名函數(shù)基礎(chǔ)上延伸出來的立即執(zhí)行函數(shù)。

       普通函數(shù)就是用function直接聲明的有名函數(shù)。

    function Hello() {
      alert("hello , everybody!");
    };
 
    Hello();
 
    function SayHelloTo(somebody) {
      alert("hello , " + somebody + "!");
    };
 
    SayHelloTo("張三");

      上面分別創(chuàng)建了Hello和SayHelloTo方法。Hello不帶有參數(shù),直接通過Hello()來完成調(diào)用。SayHelloTo方法帶有一個參數(shù),向誰問候時需要知道是在問候誰。在調(diào)用SayHelloTo(“張三”)時要傳入?yún)?shù)。這些代碼和java、C#都沒有什么太大區(qū)別。在方法重載上卻有較大改變,javascript本身并不支持什么重載,一個方法名就對應(yīng)一個方法。如果強制的寫出多個同名方法,其實會出現(xiàn)先寫的方法被覆蓋掉的情況。

    function Hello() {
      alert("hello , everybody!");
    };
 
    Hello();
 
    function Hello(somebody) {
      alert("hello , " + somebody + "!");
    };
 
    Hello("張三");

 

              
image image

      第一個Hello方法被覆蓋掉,執(zhí)行時直接調(diào)用Hello()則認(rèn)為調(diào)用第二個Hello方法但沒有傳遞參數(shù)值,所以彈出了undefined信息。調(diào)用Hello(“張三”)時很正常的完成執(zhí)行。其實javascript也可以用一些直白的方式來完成重載。學(xué)過C#的人都會知道有個params關(guān)鍵字,通過它可以實現(xiàn)向方法傳遞不定個數(shù)的參數(shù)。我們可以通過對參數(shù)的信息做手動的判斷也可以模擬出類似重載的效果。而在javascript中根本就不需要什么params關(guān)鍵字,就可以很自然的實現(xiàn)任意個數(shù)參數(shù)的傳遞。function中有個arguments屬性,可以把它看成一個數(shù)組,它按傳遞進(jìn)來的參數(shù)的順序來保存所有的參數(shù)。也就是說我們在定義方法時可以不聲明參數(shù)名。

    function ShowArguments() {
      var args = "";
      for (var i = 0; i < arguments.length; i++) {
        args += arguments[i] + ",";
      };
      alert(args.substr(0, args.length - 1));
    };
 
    ShowArguments(1, 2, 3, 4, 5, 6, 7);

          image
      試著用argements來模擬一下重載。

    function Hello() {
      if (arguments.length == 0) {
        alert("hello , everybody!");
      }
      else {
        alert("hello , " + arguments[0] + "!");
      };
    };
 
    Hello();
    Hello("張三");

      基于參數(shù)個數(shù)不同的重載。

    function Increase(arg) {
      if (typeof arg == "undefined") {
        alert("請輸入?yún)?shù)");
      }
      if (typeof arg == "string") {
        alert(String.fromCharCode(arg.charCodeAt(0) + 1));
      }
      if (typeof arg == "number") {
        alert(arg + 1);
      }
    };
    Increase();
 
    Increase("a");
    Increase(1);
      基于參數(shù)類型不同的重載。

      函數(shù)除了有名函數(shù)之外也可以是匿名函數(shù),匿名函數(shù)就是沒有名子的函數(shù),不論函數(shù)有名還是沒有名子,都是一個完整的函數(shù)對象。匿名函數(shù)還是用function來聲明,但不用為它指定名稱。其它的方面,比如參數(shù)等等和有名函數(shù)沒什么區(qū)別。

    function() {
      ……
    };

      匿名函數(shù)一般可以滿足臨時的函數(shù)需求,不需要有變量對其進(jìn)行引用(有名的函數(shù)可以認(rèn)為是有變量引用的函數(shù))。比如需要一個函數(shù)做為值對象做為參數(shù)傳入方法、需要編程的方式為對象添加事件,用匿名函數(shù)都可以很好的完成。當(dāng)然你也可以單獨聲明變量來引用某個匿名函數(shù)對象,這和普通有名函數(shù)就沒什么區(qū)別了。

    function Each(array, fun) {
      for (var i = 0; i < array.length; i++) {
        fun(array[i]);
      };
    };
    var nums = [1, 2, 3, 4, 5, 6, 7];
    Each(nums, function(arg) {
      alert(arg);
    });

      上面代碼執(zhí)行,依次輸出數(shù)組中的元素。

    //在窗體加載時,在標(biāo)題上顯示當(dāng)前時間
    window.onload = function() {
      document.title = new Date().toString();
    };
 
    //也可以將匿名方法傳入定時器中
    setInterval(function() {
      document.title = new Date().toString();
    }, 1000);

      使用匿名函數(shù)綁定事件和進(jìn)行定時操作。

    var Hello = function() {
      alert("hello , everybody!");
    };

      如果將匿名函數(shù)賦給變量,那和有名的普通函數(shù)就沒區(qū)別了。但不管是變量引用還是普通地有名函數(shù),這樣的函數(shù)在內(nèi)存上都持久的占有一定資源。有時候我們只想執(zhí)行一次大不必使用有引用的函數(shù),直接執(zhí)行匿名函數(shù)可能是最好的選擇。把匿名函數(shù)包起來,加個括號執(zhí)行,一切ok,這就是由匿名函數(shù)延伸出來的立即執(zhí)行函數(shù)。

    (function() {
      alert("hello , everybody!");
    })();
 
    (function(somebody) {
      alert("hello , " + somebody + "!");
    })("張三");

      立即執(zhí)行函數(shù)在做事件綁定,設(shè)置回調(diào)函數(shù)等方面往往會有意想不到的效果,可以解決諸如對象引用等問題。

    var student = {
      Name: "張三",
      Age: 20,
      Introduce: function() {
        alert("我叫" + this.Name + ",今年" + this.Age + "歲了!");
      } };
    window.onload = (function(obj) { return function() { obj.Introduce(); }; })(student);

      因為javascript中函數(shù)的這些特點加之它的對象的特征,我們還可以寫出一些有functional意味的程序出來。其實javascript中function真的是老大。

    function Sum(fun, x) {
      if (x <= 0)
        return 0;
      return fun(x) + Sum(fun, x - 1);
    };
  
    alert(Sum(function(i) { return i * i; }, 100));

      下面這又是什么呢?是方法嗎?是類嗎?

    function Point() {
      
    };

      先啰嗦到這,下次再看看類。

相關(guān)文章

最新評論