午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    JavaScript中的函數模式詳解
    來源:易賢網 閱讀:847 次 日期:2015-02-13 10:59:13
    溫馨提示:易賢網小編為您整理了“JavaScript中的函數模式詳解”,方便廣大網友查閱!

    這篇文章主要介紹了JavaScript中的函數模式詳解,本文講解了創(chuàng)建函數的語法、函數表達式、命名函數表達式、函數的聲明、函數聲明與表達式、函數的提升、即時函數模式等內容,需要的朋友可以參考下

    JavaScript設計模式的作用是提高代碼的重用性,可讀性,使代碼更容易的維護和擴展

    在javascript中,函數是一類對象,這表示他可以作為參數傳遞給其他函數;此外,函數還可以提供作用域。

    創(chuàng)建函數的語法

    命名函數表達式

    代碼如下:

    //命名函數表達式

    var add = function add(a,b){

    return a+b;

    };

    函數表達式

    代碼如下:

    //又名匿名函數

    var add = function(a,b){

    return a+b;

    };

    為變量 add 賦的值是函數定義本身。這樣,add 就成了一個函數,可以在任何地方調用。

    函數的聲明

    代碼如下:

    function foo(){

    //code here

    } //這里可以不需要分號

    在尾隨的分號中,函數表達式應總是使用分號,而函數的聲明中并不需要分號結尾.

    函數聲明與表達式

    函數的提升(hoisting)

    函數聲明的行為并不等同于命名函數表達式,其區(qū)別在于提升(hoisting)行為,看下面例子:

    代碼如下:

    <script type="text/javascript">

    //全局函數

    function foo(){alert("global foo!");}

    function bar(){alert('global bar');}

    function hoist(){

    console.log(typeof foo);//function

    console.log(typeof bar);//undefined

    foo();//local foo!

    bar();//TypeError: 'undefined' is not a function

    //變量foo以及實現者被提升

    function foo(){

    alert('local foo!');

    }

    //僅變量bar被提升,函數實現部分 并未被提升

    var bar = function(){

    alert('local bar!');

    };

    }

    hoist();

    </script>

    對于所有變量,無論在函數體的何處進行聲明,都會在內部被提升到函數頂部。而對于函數通用適用,其原因在于函數只是分配給變量的對象。

    提升,顧名思義,就是把下面的東西提到上面。在JS中,就是把定義在后面的東西(變量或函數)提升到前面中定義。 從上面的例子可以看出,在函數hoist內部中的foo和bar移動到了頂部,從而覆蓋了全局foo和bar函數。局部函數bar和foo的區(qū)別在于,foo被提升到了頂部且能正常運行,而bar()的定義并沒有得到提升,僅有它的聲明被提升,所以,當執(zhí)行bar()的時候顯示結果為undefined而不是作為函數來使用。

    即時函數模式

    函數也是對象,因此它們可以作為返回值。使用自執(zhí)行函數的好處是直接聲明一個匿名函數,立即使用,省得定義一個用一次就不用的函數,而且免了命名沖突的問題,js中沒有命名空間的概念,因此很容易發(fā)生函數名字沖突,一旦命名沖突以最后聲明的為準。

    模式一:

    代碼如下:

    <script>

    (function () {

    var a = 1;

    return function () {

    alert(2);

    };

    }()());//彈出2,第一個圓括號自執(zhí)行,第二個圓括號執(zhí)行內部匿名函數

    </script>

    模式二:自執(zhí)行函數變量的指向

    代碼如下:

    <script type="text/javascript">

    var result = (function () {

    return 2;

    })();//這里已執(zhí)行了函數

    alert(result);//result 指向了由自執(zhí)行函數的返回值2;如果彈出result()會出錯

    </script>

    模式三:嵌套函數

    代碼如下:

    <script type="text/javascript">

    var result = (function () {

    return function () {

    return 2;

    };

    })();

    alert(result());//alert(result)的時候彈出2;alert(result())的時候彈出function(){return 2}

    </script>

    模式四:自執(zhí)行函數把它的返回值賦給變量

    代碼如下:

    var abc = (function () {

    var a = 1;

    return function () {

    return ++a;

    }

    })();//自執(zhí)行函數把return后面的函數返回給變量

    alert(abc());//如果是alert(abc)就會彈出return語句后面的代碼;如果是abc(),則會執(zhí)行return后面的函數

    模式五:函數內部執(zhí)行自身,遞歸

    代碼如下:

    // 這是一個自執(zhí)行的函數,函數內部執(zhí)行自身,遞歸

    function abc() { abc(); }

    回調模式

    回調函數:當你將一個函數write()作為一個參數傳遞給另一個函數call()時,那么在某一時刻call()可能會執(zhí)行(或者調用)write()。這種情況下,write()就叫做回調函數(callback function)。

    異步事件監(jiān)聽器

    回調模式有許多用途,比如,當附加一個事件監(jiān)聽器到頁面上的一個元素時,實際上是提供了一個回調函數的指針,該函數將會在事件發(fā)生時被調用。如:

    代碼如下:

    document.addEventListener("click",console.log,false);

    上面代碼示例展示了文檔單擊事件時以冒泡模式傳遞給回調函數console.log()的

    javascript特別適用于事件驅動編程,因為回調模式支持程序以異步方式運行。

    超時

    使用回調模式的另一個例子是,當使用瀏覽器的window對象所提供的超時方法:setTimeout()和setInterval(),如:

    代碼如下:

    <script type="text/javascript">

    var call = function(){

    console.log("100ms will be asked…");

    };

    setTimeout(call, 100);

    </script>

    庫中的回調模式

    當設計一個js庫時,回調函數將派上用場,一個庫的代碼應盡可能地使用可復用的代碼,而回調可以幫助實現這種通用化。當我們設計一個龐大的js庫時,事實上,用戶并不會需要其中的大部分功能,而我們可以專注于核心功能并提供“掛鉤形式”的回調函數,這將使我們更容易地構建、擴展,以及自定義庫方法

    Curry化

    Curry化技術是一種通過把多個參數填充到函數體中,實現將函數轉換為一個新的經過簡化的(使之接受的參數更少)函數的技術?!揪↗avaScript】

    簡單來說,Curry化就是一個轉換過程,即我們執(zhí)行函數轉換的過程。如下例子:

    代碼如下:

    <script type="text/javascript">

    //curry化的add()函數

    function add(x,y){

    var oldx = x, oldy = y;

    if(typeof oldy == "undefined"){

    return function(newy){

    return oldx + newy;

    };

    }

    //完全應用

    return x+y;

    }

    //測試

    typeof add(5);//輸出"function"

    add(3)(4);//7

    //創(chuàng)建并存儲一個新函數

    var add2000 = add(2000);

    add2000(10);//輸出2010

    </script>

    當第一次調用add()時,它為返回的內部函數創(chuàng)建了一個閉包。該閉包將原始的x和y值存儲到私有變量oldx和oldy中。

    現在,我們將可使用任意函數curry的通用方法,如:

    代碼如下:

    <script type="text/javascript">

    //普通函數

    function add(x,y){

    return x + y;

    }

    //將一個函數curry化以獲得一個新的函數

    var newadd = test(add,5);

    newadd(4);//9

    //另一種選擇,直接調用新函數

    test(add,6)(7);//輸出13

    </script>

    何時使用Curry化

    當發(fā)現正在調用同一個函數時,并且傳遞的參數絕大多數都是相同的,那么該函數可能是用于Curry化的一個很好的候選參數

    更多信息請查看IT技術專欄

    更多信息請查看腳本欄目
    易賢網手機網站地址:JavaScript中的函數模式詳解

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
    聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網