6献起、函數(shù)的類型

函數(shù)的類型:

以上的幾種方法創(chuàng)建的函數(shù),除了匿名函數(shù)外祷杈,其他的都屬于普通函數(shù)斑司,但是JS還有幾種特殊的的函數(shù)類型

回調(diào)函數(shù):

將函數(shù)當做實參傳到另一個函數(shù)中,在另一個函數(shù)內(nèi)部調(diào)用但汞,稱為回調(diào)函數(shù)陡厘。


//創(chuàng)建一個函數(shù),并設置型參callbakc用來接收函數(shù)
function fun(callback){
//在函數(shù)內(nèi)部調(diào)用接收到的函數(shù)
    callback();
}
//調(diào)用個函數(shù)特占,并傳入另一個函數(shù),且不限制類型云茸,可以是匿名函數(shù)
fun(function (){
console.log("我是回調(diào)函數(shù)");
});

既然傳入的實參也是函數(shù)是目,那么它也遵守函數(shù)的一切原則,且擁有函數(shù)的一切功能标捺,同樣可以傳入實參:

 //設置一個函數(shù)懊纳,并設置三個型參用來接收回調(diào)函數(shù)和其他的兩個參數(shù)
 function fn(myName,sex,callback){
 //調(diào)用傳入的函數(shù),并設置兩個實參亡容,將設置的型參作為實參傳進去嗤疯,
    callback(myName,sex);
  }
  //調(diào)用函數(shù),并設置實參闺兢,其中有將一個匿名函數(shù)作為實參傳入
 fn('小蘭','女',function(myName,sex){
 //傳入的其他兩個實參會傳給fn的型參然后作為實參傳入匿名函數(shù)
    console.log('你好茂缚,我是' + myName + ',性別:' + sex)
 });

注意: 函數(shù)和變量一樣,都擁有聲明提前的特性脚囊,所以調(diào)用不管是寫在前面還是寫在后面都管用

遞歸函數(shù):

函數(shù)內(nèi)部不斷的調(diào)用本身龟糕,以達到循環(huán)效果

function fun(num){
    if(num<=1){
        return 1;
    }else{
        return num * fun( --num );
        //如果num大于1那么它將在它內(nèi)部再調(diào)用一次它自身
    }
}
console.log( fun(3) );

以上的代碼的執(zhí)行過程相當于:

function fun(3){
    if(num<=1){
        return 1;
    }else{
    
        return 3 * function fun(2){
                            if(num<=1){
                                return 1;
                            }else{
                            
                                return 2 *  function fun(1){
                                                    if(num<=1){
                                                        return 1;
                                                        //num小于或等于1,返回1
                                                    }else{
                                                        return 2 * fun( --num );
                                                    }
                                                };
                                                
                                //如果num大于1那么它將在它內(nèi)部再調(diào)用一次它自身
                            }
                        };
                        
        //如果num大于1那么它將在它內(nèi)部再調(diào)用一次它自身
    }
}
console.log( fun(3) );

遞歸函數(shù)在調(diào)用自身的時候相當于是數(shù)個函數(shù)的嵌套悔耘,JS執(zhí)行代碼的過程是逐行執(zhí)行讲岁,執(zhí)行遞歸函數(shù)時同樣,一段代碼相當于從最里面開始向外一層一層的執(zhí)行的函數(shù)的集合衬以,所以千萬不要被調(diào)用自身的那一小段代碼迷惑:

function fun(num){
    console.log(num);
    if(num<1){
        console.log("------");
    }else{
        fun(num-1);//當num不小于1的時候缓艳,調(diào)用自身,
    };
    console.log(num);
};
//相當于嵌套多個函數(shù)看峻,每個函數(shù)內(nèi)都有console.log(num);
fun(2);
//得到的結(jié)果是2 1 0 ------ 0 1 2

閉包函數(shù):

可以將函數(shù)內(nèi)部的變量返回到外部阶淘,在外部訪問

作用域

說到閉包,就不得不說一下作用域备籽,JS中的作用于有局部作用域個全局作用域:

  • 在函數(shù)外聲明的變量為全局作用域舶治,任何函數(shù)的任何層嵌套都可以訪問,
  • 在函數(shù)內(nèi)聲明的變量為局部作用域车猬,只有在函數(shù)內(nèi)和本函數(shù)嵌套的任意層函數(shù)可以訪問霉猛,
  • 簡單來說,就是局部可以訪問全局珠闰,而全局不能訪問局部
var  a = "我是全局變量";
    function fun() {   
        var b = "我是局部變量";    
         console.log("我可以訪問"+a+"也可以訪問"+b+"O场!伏嗜!");
    }
    fun();
    console.log("我可以訪問"+a+"但我訪問不了"+b+"L诚ぁ!承绸!");
    //函數(shù)內(nèi)的代碼會被正常執(zhí)行裸影,但是函數(shù)外的代碼會報錯,找不到變量b

閉包函數(shù)

是通過return給函數(shù)內(nèi)嵌套的函數(shù)內(nèi)定義一個變量军熏,然后將其返回出來轩猩,直到返回到需要的層域或全局:

function fun(){
    return function(){
    //將這個函數(shù)返回給上層函數(shù)
        var a = 10;
        return a;
        //將變量a返回給函數(shù)
    }
}
console.log(fun()());

閉包在JS中還有很多應用,也有很多的坑荡澎,這里先簡單了解一下

立即執(zhí)行函數(shù):

立即執(zhí)行函數(shù)也是匿名函數(shù)均践,但它和普通匿名函數(shù)所不同的是:匿名函數(shù)無法調(diào)用,而立即執(zhí)行函數(shù)是調(diào)用自身且只可調(diào)用一次摩幔,如下:

//普通匿名函數(shù)
function (){
console.log("我不能執(zhí)行彤委,因為我無法調(diào)用")
};
//立即執(zhí)行函數(shù)
;(function (){
console.log("我是立即執(zhí)行函數(shù),我調(diào)用我自己")
})();
//因為瀏覽器的原因或衡,最好在函數(shù)前后各加一個分號焦影,才不會因為某些原因出錯

你發(fā)現(xiàn)這兩者的區(qū)別了沒车遂?沒錯,其實就是在函數(shù)后加上了一個括號偷办,它的形式其實和其他類型的函數(shù)是一樣的

//定義一個函數(shù)
function myfun(){

}
//調(diào)用一個函數(shù)
myfun()艰额;
//myfun() == function myfun(){   }

因為瀏覽器會自動給代碼添加分號,為了讓瀏覽器認為匿名函數(shù)是一個整體椒涯,我們就需要用括號將整個函數(shù)包裹起來柄沮,然后在后面添加括號來調(diào)用,原理等同普通函數(shù)通過函數(shù)名調(diào)用废岂,
注意: 在代碼后需要添加分號結(jié)尾祖搓,為了防止前面因為漏加分號導致報錯,所以最好在代碼前也加上一個分號湖苞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拯欧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子财骨,更是在濱河造成了極大的恐慌镐作,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隆箩,死亡現(xiàn)場離奇詭異该贾,居然都是意外死亡,警方通過查閱死者的電腦和手機捌臊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門杨蛋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人理澎,你說我怎么就攤上這事逞力。” “怎么了糠爬?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵寇荧,是天一觀的道長。 經(jīng)常有香客問我执隧,道長砚亭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任殴玛,我火速辦了婚禮,結(jié)果婚禮上添祸,老公的妹妹穿的比我還像新娘滚粟。我一直安慰自己,他們只是感情好刃泌,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布凡壤。 她就那樣靜靜地躺著署尤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亚侠。 梳的紋絲不亂的頭發(fā)上曹体,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音硝烂,去河邊找鬼箕别。 笑死,一個胖子當著我的面吹牛滞谢,可吹牛的內(nèi)容都是我干的串稀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼狮杨,長吁一口氣:“原來是場噩夢啊……” “哼母截!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起橄教,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤清寇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后护蝶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體华烟,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年滓走,在試婚紗的時候發(fā)現(xiàn)自己被綠了垦江。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡搅方,死狀恐怖比吭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姨涡,我是刑警寧澤衩藤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站涛漂,受9級特大地震影響赏表,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匈仗,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一瓢剿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悠轩,春花似錦间狂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忙菠。三九已至,卻和暖如春纺弊,著一層夾襖步出監(jiān)牢的瞬間牛欢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工淆游, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傍睹,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓稽犁,卻偏偏與公主長得像焰望,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子已亥,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)和對象 1熊赖、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句虑椎,而且...
    道無虛閱讀 4,581評論 0 5
  • ??函數(shù)表達式是 JavaScript 中的一個既強大有容易令人困惑的特性捆姜。定義函數(shù)的的方式有兩種: 函數(shù)聲明传趾; ...
    霜天曉閱讀 819評論 0 1
  • 參考文章:函數(shù) 1.概述 1.1函數(shù)的聲明 JavaScript 有三種聲明函數(shù)的方法。 (1)function ...
    chrisghb閱讀 1,176評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,111評論 1 32
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,835評論 0 38