函數(shù)表達式、匿名函數(shù)禽篱、閉包

這兩天看這個理論知識畜伐,看的有點小惡心了√陕剩÷杲纾現(xiàn)在稍微總結(jié)一下,大體知道的悼吱,然后不全的再隨著自己的理解往上加慎框。

函數(shù)表達式

  • 什么是函數(shù)表達式?
    定義函數(shù)有兩種方式后添,一個是函數(shù)聲明笨枯,另一個是函數(shù)表達式。函數(shù)聲明最重要的一個特征是函數(shù)聲明提升。
    函數(shù)聲明:

    function functionName(arg0猎醇, arg1窥突, arg2){
        //函數(shù)體
    }
    

函數(shù)表達式:

    var functionName = function(arg0, arg1, arg2) {
        //函數(shù)體
    }
  • 為啥會出現(xiàn)函數(shù)表達式?
    既然函數(shù)聲明比較好理解硫嘶,同時還具有函數(shù)聲明提升的特征阻问,為啥要出現(xiàn)函數(shù)表達式?沦疾?
    原因一:

    if(condition) {
        function sayHi( ){
            alert(" Hi ! ");
        }
    }else{
        function sayHi( ){
            alert(" Yo ! ");
        }
    }
    

其實上面代碼的本意是很清楚的称近,希望能根據(jù)不同的condition可以執(zhí)行不同的部分。但是哮塞,函數(shù)聲明提升會導致語法錯誤刨秆,而各個瀏覽器修復錯誤的方式是不同的,所以執(zhí)行結(jié)果也會不同忆畅。這個時候衡未,函數(shù)表達式可以解決這個問題。

    if(condition) {
        sayHi = function ( ){
            alert(" Hi ! ");
        }
    }else{
         sayHi function ( ){
            alert(" Yo ! ");
        }
    }

原因二:
javascript中沒有塊級作用域的概念家凯,可以使用函數(shù)表達式缓醋、匿名函數(shù)來模擬實現(xiàn)這個功能。

var someFunction = function( ) {
    //這里是塊級作用域
}绊诲;
someFunction( );

同時在這里說一下“立即執(zhí)行函數(shù)表達式”送粱,常見的幾種方式包括
(1)

( function ( ){
    console.log(" test ! ");
})( );

(2)

( function ( ){
    console.log(" test ! ");
}( ));

以上是正確的“立即執(zhí)行函數(shù)表達式”的正確寫法〉嘀可能很多人會有疑問抗俄,為什么要這樣子寫?世舰?

function ( ){ }( );      //出錯

當像上面這樣寫的時候动雹,會出現(xiàn)語法錯誤,因為javascript當遇到function關(guān)鍵字時跟压,會當作函數(shù)聲明的開始洽胶,而函數(shù)聲明后面跟的應該是函數(shù)名,而不能是圓括號裆馒,所以會出現(xiàn)語法錯誤姊氓。那為啥上面兩種方法就可以實現(xiàn)“立即執(zhí)行”的功能,不報錯呢喷好。因為javascipt中語法中翔横,()里面會自動解析成表達式,而不是語句梗搅。比如:

 / / 如果傳入字面量(literal)禾唁,則返回表達式(expression)
(1) // 1
(function(){console.log("f");}) // function () {console.log("f")}

通過上面的描述應該大概懂了一些效览,那如何實現(xiàn)模擬塊級作用域的呢。

 //a.js 
var num = 1;
// code....

 //b.js 
var num = 2;
// code....

當同時引入a.js荡短、b.js時丐枉,一定會造成num變量的覆蓋,為了解決這個問題掘托,我們的“立即執(zhí)行函數(shù)表達式”就發(fā)揮作用了呢瘦锹。
a.js

 (function(){
    var num = 1;
    // code....
 })();

b.js

 (function(){
    var num = 1;
    // code....
 })();

經(jīng)過改造之后,現(xiàn)在兩個庫成為完全獨立的了闪盔,就可以放心大膽的使用了弯院。

匿名函數(shù):顧名思義,就是沒有名字的函數(shù)泪掀。

匿名函數(shù)的用途之一就是把函數(shù)當成值來使用听绳。

閉包

  • 啥是閉包?
    閉包就是能夠讀取其它函數(shù)內(nèi)部變量的函數(shù)异赫。是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁椅挣。

  • 閉包的用處?塔拳?
    為啥會出現(xiàn)閉包呢鼠证,因為javascript作用域鏈的作用,函數(shù)內(nèi)部可以訪問函數(shù)外部的作用域蝙斜,但是外部想訪問內(nèi)部的變量就不可以了。閉包的最大用處有2個澎胡,一個是可以讀取函數(shù)內(nèi)部的變量孕荠,另一個就是可以讓這些變量的值始終保持在內(nèi)存中。

  • 閉包經(jīng)常出現(xiàn)的問題

    function createFunctions(){
        var result = new Array();
    
        for(var i = 0; i < 10; i++){
            result[i] = function(){
                return i;
            };
        }
        return result;
    }
    

上面代碼返回的數(shù)組攻谁,每個函數(shù)都返回的是10稚伍。因為每個函數(shù)的作用域鏈中都保存著createFunctions()函數(shù)的活動對象,所以它們引用都是同一個變量i戚宦。我們可以通過創(chuàng)建另一個匿名函數(shù)強制讓閉包的行為符合預期个曙。

    function createFunctions(){
        var result = new Array();

        for(var i = 0; i < 10; i++){
            result[i] = function(num){
                return function(){
                    return num;
                };
            }(i);
        }
        return result;
    }
  • 閉包用來模擬單例

    var counter = (function(){
    var i = 0;
    return {
        get: function(){
            return i;
        },
        set: function( val ){
            i = val;
        },
        increment: function() {
            return ++i;
        }
     };
    }());
    
    counter.get(); // 0
    counter.set( 3 );
    counter.increment(); // 4
    counter.increment(); // 5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市受楼,隨后出現(xiàn)的幾起案子垦搬,更是在濱河造成了極大的恐慌,老刑警劉巖艳汽,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猴贰,死亡現(xiàn)場離奇詭異,居然都是意外死亡河狐,警方通過查閱死者的電腦和手機米绕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門瑟捣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栅干,你說我怎么就攤上這事迈套。” “怎么了碱鳞?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵桑李,是天一觀的道長。 經(jīng)常有香客問我劫笙,道長芙扎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任填大,我火速辦了婚禮戒洼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘允华。我一直安慰自己圈浇,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布靴寂。 她就那樣靜靜地躺著磷蜀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪百炬。 梳的紋絲不亂的頭發(fā)上褐隆,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機與錄音剖踊,去河邊找鬼庶弃。 笑死,一個胖子當著我的面吹牛德澈,可吹牛的內(nèi)容都是我干的歇攻。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼梆造,長吁一口氣:“原來是場噩夢啊……” “哼缴守!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镇辉,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤屡穗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后忽肛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸡捐,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年麻裁,在試婚紗的時候發(fā)現(xiàn)自己被綠了箍镜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片源祈。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖色迂,靈堂內(nèi)的尸體忽然破棺而出香缺,到底是詐尸還是另有隱情,我是刑警寧澤歇僧,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布图张,位于F島的核電站,受9級特大地震影響诈悍,放射性物質(zhì)發(fā)生泄漏祸轮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一侥钳、第九天 我趴在偏房一處隱蔽的房頂上張望适袜。 院中可真熱鬧,春花似錦舷夺、人聲如沸苦酱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疫萤。三九已至,卻和暖如春敢伸,著一層夾襖步出監(jiān)牢的瞬間扯饶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工池颈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尾序,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓饶辙,卻偏偏與公主長得像蹲诀,于是被迫代替她去往敵國和親斑粱。 傳聞我的和親對象是個殘疾皇子弃揽,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

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

  • 86.復合 Cases 共享相同代碼塊的多個switch 分支 分支可以合并, 寫在分支后用逗號分開。如果任何模式...
    無灃閱讀 1,379評論 1 5
  • 第一章: JS簡介 從當初簡單的語言则北,變成了現(xiàn)在能夠處理復雜計算和交互矿微,擁有閉包、匿名函數(shù)尚揣, 甚至元編程等...
    LaBaby_閱讀 1,679評論 0 6
  • Chapter 7 函數(shù)表達式 基本概念 函數(shù)聲明提升:執(zhí)行代碼前會先讀取函數(shù)聲明涌矢。函數(shù)聲明function sa...
    云之外閱讀 243評論 0 0
  • 1:閉包:一個函數(shù)外加上該函數(shù)所創(chuàng)建時所建立的作用域。閉包的名字來源于閉包“關(guān)閉”一個函數(shù)中自由變量的訪問的權(quán)利快骗。...
    冰激凌_db91閱讀 305評論 0 0
  • [TOC] 內(nèi)容 時間:2016/11/23 耗時28分鐘 截圖 總結(jié) 注意女子底的寫法
    上山老人閱讀 84評論 0 0