【JS】什麼是閉包?唐玄宗告訴你。

 

​大家好!自“閉包”概念誕生以來,所有的博客只要談到“閉包”就有很多不同的看法。今天“原生JS”請來了特邀嘉賓唐玄宗李隆基跟大家聊一聊“閉包”。

 

李瑁進言

衆,辛也。朕李隆基,後追廟號唐玄宗。今特受“原生JS”之厚邀爲衆解“閉包”惑。

爾等都知朕與楊玉環之事否?我便以此舉例爲佳。

那日朕往李瑁府中看望李瑁(真後悔給他起這麼有禮貌個名),食畢,楊玉環方上座,朕美之也。席間李瑁跟朕聊到:“父皇,天下大事吾盡少知,唯有一事不明,欲請教於父皇。”

朕心想,小兒有惑不請太傅,問我何意。李瑁似乎看穿了朕的心思:“父皇,此事不便與外人道也。”

朕當時心虛:“莫不是想問我奪權之事?”,臉上卻繃着:“但說無妨。”

“吾等皆出於母,自幼寢食與母,玩樂與母。以致少壯甚至耄(讀作冒)耋(讀作蝶),皆以垂髫(讀作條)之樂可追矣。吾聞邊境蠻夷有父可與兒媳同寢,今天下孝先行,胡不赦父可與兒媳共玩樂,同寢食以報兒之幼時樂矣?”

“瑁之所言,不無道理,朕可慮矣。”朕掩住內心喜悅,對李瑁說。

 

萬全之策

這父親與兒媳怎能同寢同樂?豈不亂了倫理綱常?但李瑁之言,確實讓朕寢食難安。思來想去,似乎...天下爲父者有些喫虧?可是,這亂乎倫理毀綱常的事,怎能光明正大地搬上臺面?朕日思夜想,終不得萬全之策。

一日,朕外派之使臣回來向朕覆命。交流中,他向朕傳遞了國外一種先進的思想,叫做“克魯瑟(closure)”。後面具體說了什麼嗚哩哇啦的我忘記了。唯一有印象的是“這個克魯瑟可以讓人光明正大地用別人的東西”。

正常地接風宴請之後,朕堂而皇之地宣使臣進寢宮,說是請教“克魯瑟”先進思想。深入學習“克魯瑟”先進思想之後。朕豁然開朗。李瑁進言的孝道似乎有了萬全法。

“世間安得雙全法,不負李瑁不負天下”,可今日,朕三郎李隆基卻尋得這雙全法了。

 

奪妻大計

酣睡一夜後,第二日一早,朕便頒佈條令讓楊玉環(李瑁之妻)出家入道。這是朕“奪妻”計劃的第一步,只有出了家,楊玉環纔不算是李瑁之人,朕將楊玉環暴露在李瑁府外時,便可光明正大召她入宮。如此一來,既不算採納了李瑁進言,亂了倫理綱常,亦得到了美人楊玉環。豈不美哉?

在對楊玉環的朝思暮想中,朕度過了數日煎熬。畢竟不能剛入道,就把美人召入宮中罷!那也擡~明顯了。

最終,在數日之後,朕假入道觀,召楊玉環入皇宮道觀。至此,朕終於得到了玉環!此爲學識之力也!

罷了,故事結了,“原生JS”跟我說“閉包”就是當年我用的“克魯瑟”之法。

想不到,朕還挺超前的。

"克魯瑟"就是如此。請根據朕和玉環的故事來看一段僞代碼。

 

function 李隆基 () {
    var 媳婦 = '';
    function 李瑁 () {
        var 媳婦 = '楊玉環';
        return 媳婦;
    }
    媳婦 = 李瑁();
    console.log(媳婦);
}
李隆基();

 

( 以下爲可運行的代碼 )

function llj () {
    var wife = '';
    function lm () {
        var wife = 'yyh';
        return wife;
    }
    wife = lm();
    console.log(wife);
}
llj();

 

我若爲瑁

後來朕想了想,倘若李瑁也懂“克魯瑟”的話。他也可以充分利用“克魯瑟”來保護楊玉環。具體的做法就是,把楊玉環藏起來,一開始就不暴露出來,我讓他引朕去看他媳婦時,隨便給朕一個胭脂俗粉即可矣。其爲移花接木或稱狸貓換太子。

來看保護楊玉環可採取的代碼。

 

function 李隆基() {
     function 李瑁() {
          var 媳婦 = '楊玉環';
          function 換媳婦(val) {
              var 假媳婦 = '楊玉環';
            return 假媳婦 += val ;
          }
          return {
            告訴別人我的媳婦1: function() {
                  return 換媳婦(1);
            },
            告訴別人我的媳婦2: function() {
                  return 換媳婦(2);
            },
            自己看媳婦 : function () {
                return 媳婦;
            }
          }   
    };
    var 媳婦 = 李瑁(); //實例化一個李瑁,李隆基的媳婦從李瑁那裏來
    console.log(媳婦.告訴別人我的媳婦1());
        //李隆基此時看到的媳婦是李瑁告訴他的 -- 楊玉環1
    console.log(媳婦.告訴別人我的媳婦2());
        //同上 -- 楊玉環2
    console.log(媳婦.自己看媳婦());
    //李瑁自己看媳婦 -- 楊玉環
}
李隆基();

 

function llj() {
     function lm() {
          var wife = 'yyh';
          function showWife(val) {
              var wife = 'yyh';
            return wife += val ;
          }
          return {
            showWife1: function() {
                  return showWife(1);
            },
            showWife2: function() {
                  return showWife(2);
            },
            value: function() {
                  return wife;
            }
          }   
    };
    var wife = lm();
    console.log(wife.showWife1());
    console.log(wife.showWife2());
    console.log(wife.value());
}
llj();

 

朕有話說

從哲學的角度來定義生死的話,就是說:“當你還存在於某人的記憶中的時候,你就還活着。當沒有人記得你的時候,你也就死了。”

這也是讓朕比較頭疼的一點。雖然李瑁沒有死,但玉環心裏還是偶念起他,倒也能理解,畢竟身爲人婦也幾載,但朕心裏總不是個味。當時,使臣也跟朕說過,“克魯瑟”用不好的話,是有這麼一點弊端,術語稱之爲“內存泄漏”。

唉,爲了玉環,忍了吧!

 

 原生JS寄語

各位,知識的力量是無窮的。

知道各位對閉包很有想法,來評論區交流吧~

 


關注公衆號“原生JS

回覆“WebStorm”: 以後不用再辛苦找尋註冊碼

回覆“禮包”:免費領取84本前端PDF,最新BAT面試題與Flutter教程

不定期更新最新技術乾貨,用最簡單明瞭的方式讓你記住JS知識點。

 

你關注我

我教你JavaScript

你不關注我

我教你同事JavaScript

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章