亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

JavaScript函數模式詳解

2024-05-06 16:10:26
字體:
來源:轉載
供稿:網友
文章對javascript的四種函數模式進行了詳細的解釋,并附上示例,方便小伙伴們理解并應用,希望對大家能有所幫助。
 
 

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

js函數基礎部分:javascript學習筆記(四)function函數部分

創建函數的語法

命名函數表達式

 

復制代碼代碼如下:

//命名函數表達式
var add = function add(a,b){
    return a+b;
};

 

函數表達式

 

復制代碼代碼如下:

//又名匿名函數
var add = function(a,b){
    return a+b;
};

 

函數的聲明

 

復制代碼代碼如下:

function foo(){
    //code here
}  //這里可以不需要分號

 

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

函數聲明與表達式

函數的提升(hoisting)

函數聲明的行為并不等同于命名函數表達式,其區別在于提升(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的區別在于,foo被提升到了頂部且能正常運行,而bar()的定義并沒有得到提升,僅有它的聲明被提升,所以,當執行bar()的時候顯示結果為undefined而不是作為函數來使用。

即時函數模式

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

模式一:

 

復制代碼代碼如下:

<script>
    (function () {
        var a = 1;
        return function () {
            alert(2);
        };
    }()());//彈出2,第一個圓括號自執行,第二個圓括號執行內部匿名函數
</script>

 

模式二:自執行函數變量的指向

 

復制代碼代碼如下:

<script type="text/javascript">
        var result = (function () {
            return 2;
        })();//這里已執行了函數

 

        alert(result);//result 指向了由自執行函數的返回值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>

 

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

 

復制代碼代碼如下:

    var abc = (function () {
            var a = 1;
            return function () {
                return ++a;
            }
        })();//自執行函數把return后面的函數返回給變量
   alert(abc());//如果是alert(abc)就會彈出return語句后面的代碼;如果是abc(),則會執行return后面的函數

 

模式五:函數內部執行自身,遞歸

 

復制代碼代碼如下:

// 這是一個自執行的函數,函數內部執行自身,遞歸
function abc() { abc(); }

 

回調模式

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

異步事件監聽器

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

 

復制代碼代碼如下:

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化技術是一種通過把多個參數填充到函數體中,實現將函數轉換為一個新的經過簡化的(使之接受的參數更少)函數的技術。———【精通JavaScript】

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

 

復制代碼代碼如下:

<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
    //創建并存儲一個新函數
    var add2000 = add(2000);
    add2000(10);//輸出2010
</script>

當第一次調用add()時,它為返回的內部函數創建了一個閉包。該閉包將原始的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化

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一男人av| 国产ts一区二区| 国产精品高清在线| 久久免费视频这里只有精品| 国产精品视频导航| 欧美激情视频一区| 久久久www成人免费精品张筱雨| 国产精品网站视频| 精品色蜜蜜精品视频在线观看| 精品久久久久久中文字幕| 日韩在线观看免费全集电视剧网站| 国产精品久久久久久久av电影| 欧美日韩福利视频| 亚洲午夜未满十八勿入免费观看全集| 欧美精品久久久久a| 成人h片在线播放免费网站| 国产精品专区h在线观看| 亚洲欧美激情四射在线日| 亚洲欧美国产一区二区三区| 国产综合在线视频| 久久精品视频亚洲| 九九热这里只有精品免费看| 中文国产亚洲喷潮| 2018日韩中文字幕| 性欧美办公室18xxxxhd| 91久久久久久久久久久| 欧美专区在线观看| 国产美女91呻吟求| 亚洲开心激情网| 国产91亚洲精品| 国产一区二区在线播放| 国产主播欧美精品| 精品一区二区三区电影| 久久精品国产91精品亚洲| 日韩精品视频中文在线观看| 一个人看的www欧美| 国产精品久久久久久久久久久久| 日韩av中文在线| 亚洲人成电影在线| 日本三级久久久| 亚洲精品色婷婷福利天堂| 在线观看国产精品日韩av| 欧美视频中文在线看| 97成人精品视频在线观看| xvideos成人免费中文版| 国产精品视频色| 最近2019中文字幕一页二页| 欧美视频在线免费看| 日韩久久精品成人| 日韩av电影手机在线观看| 在线视频欧美日韩| 精品国产网站地址| 国产一区二区久久精品| 国产69久久精品成人看| 欧美一区二区三区免费视| 日韩视频免费在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品9999| 国产精品丝袜视频| 国产欧美日韩中文字幕| 国产视频久久网| 亚洲高清色综合| 国产午夜精品全部视频在线播放| 欧美高清videos高潮hd| 久久久人成影片一区二区三区| 91九色国产社区在线观看| 亚洲男人第一av网站| 久久久亚洲国产天美传媒修理工| 亚洲欧美制服另类日韩| 久久久久久国产精品三级玉女聊斋| 欧美性色19p| 国产精品久久久久久久久久三级| 欧美电影免费观看高清| 亚洲成人av在线播放| 日韩在线小视频| 日韩精品中文在线观看| 久久免费视频网| 一区二区在线视频| 亚洲国产三级网| 精品女厕一区二区三区| 欧美日韩另类视频| 亚洲欧美综合精品久久成人| 亚洲自拍欧美色图| 欧美性猛交xxxx乱大交3| 精品国偷自产在线视频| 国产在线拍揄自揄视频不卡99| 亚洲丁香婷深爱综合| 精品无人区乱码1区2区3区在线| 久久精品美女视频网站| 久久视频在线播放| 日韩av123| 久久久国产在线视频| 91理论片午午论夜理片久久| 亚洲视频日韩精品| 麻豆成人在线看| 欧美日韩国产中文精品字幕自在自线| 欧美大片网站在线观看| 美女视频黄免费的亚洲男人天堂| 日韩在线视频免费观看| 久久久久亚洲精品成人网小说| 国产一区玩具在线观看| 91精品国产综合久久香蕉的用户体验| 日韩av在线导航| 98午夜经典影视| 这里只有精品视频| 亚洲欧美视频在线| 亚洲精品小视频| 亚洲高清久久久久久| 狠狠躁18三区二区一区| 亚洲高清av在线| 欧美日韩一区二区三区在线免费观看| 午夜精品久久久久久99热软件| yw.139尤物在线精品视频| 亚洲高清色综合| 国产精品亚洲网站| 日韩动漫免费观看电视剧高清| 成人自拍性视频| 亚洲国产古装精品网站| 亚洲激情在线视频| 精品一区二区电影| 在线不卡国产精品| 国产精品18久久久久久首页狼| 欧美色视频日本高清在线观看| 亚洲精品综合精品自拍| 国产成人精品久久| 亚洲a区在线视频| 国产精品嫩草影院一区二区| 日韩精品欧美国产精品忘忧草| 国产精品一区二区三区免费视频| 欧美成人手机在线| 国产日韩专区在线| 欧美日韩美女视频| 日韩av电影在线免费播放| 欧美性精品220| 国产婷婷97碰碰久久人人蜜臀| 亚洲国产精品yw在线观看| 亚洲www视频| 另类少妇人与禽zozz0性伦| 97视频色精品| 欧美裸体男粗大视频在线观看| 欧美电影电视剧在线观看| 国产精品aaaa| 国产精品久久婷婷六月丁香| 国产欧美日韩中文| 日韩av三级在线观看| 亚洲综合小说区| 丝袜一区二区三区| 久久天天躁狠狠躁老女人| 色婷婷综合成人| 日韩成人中文字幕| 永久免费看mv网站入口亚洲| 7m第一福利500精品视频| 热99久久精品| 精品色蜜蜜精品视频在线观看| 91深夜福利视频| 日韩在线视频一区| 日韩高清人体午夜| 国产精品久久一| 亚洲男人天堂古典| 久久久97精品| 欧美富婆性猛交| 欧美视频精品一区| 日韩在线视频线视频免费网站| 91嫩草在线视频|