大家好!自“閉包”概念誕生以來,所有的博客只要談到“閉包”就有很多不同的看法。今天“原生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