端面試中讓你困惑的閉包、原型账千、原型鏈究竟是什么侥蒙?

前端面試中讓你困惑的閉包、原型匀奏、原型鏈究竟是什么鞭衩?

前段時(shí)間我朋友從上家公司離職,上周開始了前端面試(現(xiàn)在已經(jīng)上班了)娃善,一天我下班回到出租房時(shí)论衍,他問我原型鏈?zhǔn)鞘裁矗恳粫r(shí)半會(huì)我竟然也不知道從何說起能夠讓他很清楚的明白聚磺,又忽然想起之前我一個(gè)朋友也問過我閉包的問題坯台,因此在這里記錄解惑一下,下面我會(huì)以面試官和應(yīng)聘者的口吻進(jìn)行介紹理解......

一.閉包

面試官:什么是閉包瘫寝?閉包你了解嗎蜒蕾?

應(yīng)聘者:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。

面試官:通俗一點(diǎn)呢焕阿?

應(yīng)聘者:通俗的講就是函數(shù)a的內(nèi)部函數(shù)b咪啡,被函數(shù)a外部的一個(gè)變量引用的時(shí)候,就創(chuàng)建了一個(gè)閉包捣鲸。

面試官:是這樣瑟匆,沒錯(cuò),那你知道什么情況下會(huì)用到閉包嗎栽惶?

應(yīng)聘者:最常見的是函數(shù)封裝的時(shí)候愁溜,再就是在使用定時(shí)器的時(shí)候,會(huì)經(jīng)常用到...

面試官:那你簡(jiǎn)單寫一個(gè)閉包吧

應(yīng)聘者:

<pre style="margin: 0px; padding: 0px;
 white-space: pre-wrap; 
overflow-wrap: break-word; 
font-family: &quot;Courier New&quot; 
!important; font-size: 12px !important;">
function a(){ var i=0; function b(){
         alert(++i);
     } return b;
} var c = a();
c();//外部的變量
</pre>

面試官:你這個(gè)寫法是正確的外厂,那我衍生一下冕象,你回答一下依次會(huì)彈出什么:

<pre style="margin: 0px; padding: 0px;
 white-space: pre-wrap; 
overflow-wrap: break-word;
 font-family: &quot;Courier New&quot; 
!important; font-size: 12px !important;">
function a(){ var i=0; function b(){
         i++;
         alert(i);
     } return b;
} var c = a();
c();//?
c();//汁蝶?
c();//渐扮?
</pre>

應(yīng)聘者:應(yīng)該是會(huì)依次彈出1,2,3。

面試官:沒錯(cuò)掖棉,你回答的很對(duì)墓律,你知道其中的原理嗎?能否解釋一下

應(yīng)聘者:好的幔亥,i是函數(shù)a中的一個(gè)變量耻讽,它的值在函數(shù)b中被改變,函數(shù)b每執(zhí)行一次帕棉,i的值就在原來的基礎(chǔ)上累加 1 针肥。因此饼记,函數(shù)a中的i變量會(huì)一直保存在內(nèi)存中。

            當(dāng)我們需要在模塊中定義一些變量慰枕,并希望這些變量一直保存在內(nèi)存中但又不會(huì) “污染” 全局的變量時(shí)具则,就可以用閉包來定義這個(gè)模塊。

面試官:非常棒具帮,你說的這是它的一個(gè)用處博肋,你能說一下閉包的用處有哪些嗎?

應(yīng)聘者:它的最大用處有兩個(gè)匕坯,一個(gè)是它可以讀取函數(shù)內(nèi)部的變量束昵,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中。

面試官:那我順便再出個(gè)問題考考你吧葛峻,請(qǐng)看題:

<pre style="margin: 0px; 
padding: 0px; 
white-space: pre-wrap; 
overflow-wrap: break-word; 
font-family: &quot;Courier New&quot;
 !important; font-size: 12px !important;">
var num = new Array(); for(var i=0; i<4; i++){
    num[i] = f1(i);
} function f1(n){ function f2(){
         alert(n);
     } return f2;
}
num[2]();
num[1]();
num[0]();
num[3]();</pre>

應(yīng)聘者:答案為2,1,0,3(這個(gè)時(shí)候你了解清楚閉包之后锹雏,這個(gè)答案應(yīng)該就是隨口而出),解釋如下:

<pre style="margin: 0px; padding: 0px; 
white-space: pre-wrap; 
overflow-wrap: break-word;
 font-family: &quot;Courier New&quot;
 !important; font-size: 12px !important;">//創(chuàng)建數(shù)組元素
var num = new Array(); 
for(var i=0; i<4; i++){ //num[i] = 閉包;//閉包被調(diào)用了4次术奖,就會(huì)生成4個(gè)獨(dú)立的函數(shù)
    //每個(gè)函數(shù)內(nèi)部有自己可以訪問的個(gè)性化(差異)的信息
    num[i] = f1(i);
} function f1(n){ function f2(){
         alert(n);
     } return f2;
}
num[2]();  //2
num[1]();  //1
num[0]();  //0
num[3]();  //3</pre>

面試官:那你知道閉包的優(yōu)缺點(diǎn)嗎礁遵?

應(yīng)聘者:

優(yōu)點(diǎn):

    ① 減少全局變量;

    ② 減少傳遞函數(shù)的參數(shù)量采记;

    ③ 封裝佣耐;

缺點(diǎn):

    ① 使用閉包會(huì)占有內(nèi)存資源,過多的使用閉包會(huì)導(dǎo)致內(nèi)存溢出等

面試官:正好你提到了內(nèi)存泄漏唧龄,說說你的解決方法

應(yīng)聘者:簡(jiǎn)單的說就是把那些不需要的變量兼砖,但是垃圾回收又收不走的的那些賦值為null,然后讓垃圾回收走既棺;

面試官:看來閉包已經(jīng)難不倒你了讽挟,閉包就到這里告一段落了,接下來考考你原型和原型鏈丸冕。

二.原型和原型鏈

面試官:你好耽梅,接下來考考你原型和原型鏈

應(yīng)聘者:好的,請(qǐng)問

面試官:你解釋一下原型的概念吧胖烛!

應(yīng)聘者: 原型(prototype)是function對(duì)象的一個(gè)屬性眼姐,它定義了構(gòu)造函數(shù)制造出的對(duì)象的公共祖先(公共的屬性和方法)通過該構(gòu)造函數(shù)產(chǎn)生的對(duì)象,可以繼承改原型的屬性和方法佩番。 原型也是對(duì)象众旗。

面試官:通俗一點(diǎn)呢?

應(yīng)聘者:通俗的說趟畏,原型就是一個(gè)模板逝钥,更準(zhǔn)確的說是一個(gè)對(duì)象模板

面試官:那你接著說一下原型鏈?zhǔn)鞘裁矗?/p>

應(yīng)聘者:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)想指針(constructor),而實(shí)例對(duì)象都包含一個(gè)指向原型對(duì)象的內(nèi)部指針(proto)艘款。如果讓原型對(duì)象等于另一個(gè)類型的實(shí)例,此時(shí)的原型對(duì)象將包含一個(gè)指向另一個(gè)原型的指針(proto)沃琅,另一個(gè)原型也包含著一個(gè)指向另一個(gè)構(gòu)造函數(shù)的指針(constructor)哗咆。假如另一個(gè)原型又是另一個(gè)類型的實(shí)例,如此層層遞進(jìn)益眉,這就構(gòu)成了實(shí)例與原型的鏈條晌柬。這就是原型鏈的基本概念;

面試官:你這個(gè)說太多了郭脂,簡(jiǎn)單一點(diǎn)

應(yīng)聘者:就是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法年碘;

             舉例說明: Student → Person → Object   ,學(xué)生繼承人類展鸡,人類繼承對(duì)象類

面試官:我看你說到了繼承屿衅,那你簡(jiǎn)單寫一個(gè)原型鏈繼承的例子

應(yīng)聘者:好,如下

<pre style="margin: 0px; padding: 0px; 
white-space: pre-wrap; 
overflow-wrap: break-word;
 font-family: &quot;
Courier New&quot;
 !important; font-size: 12px !important;">
function Animal(name) { this.name = name
}

Animal.prototype.getName = function() {
    console.log(this.name)
} var animal1 = new Animal('Kate') var animal2 = new Animal('Lucy')
 //對(duì)象animal1 和 animal2共享方法getName
animal1.getName()
animal2.getName()</pre>

面試官:ok莹弊,那我出個(gè)問題考考你涤久,你告訴我結(jié)果,題目如下:

<pre style="margin: 0px; 
padding: 0px;
 white-space: pre-wrap; 
overflow-wrap: break-word;
 font-family: &quot;Courier New&quot;
 !important; font-size: 12px !important;">
var A=function(){}

A.prototype.n=1

var b=new A()

A.prototype={
     n:2,
     m:3 } var c=new A()

console.log(b.n,b.m,c.n,c.m)//多少</pre>

應(yīng)聘者:答案為1,undefined,2,3忍弛。原因是b繼承A,所以b.n就為1响迂,而m在A中找不到,所以為undefined细疚,以此類推蔗彤,c繼承的時(shí)候A添加了n和m,所以c.n和c.m分別是2和3;

面試官:你回答的很棒疯兼,你知道null和undefined的區(qū)別嗎然遏?

應(yīng)聘者:undefined是一個(gè)表示"無"的原始值,

`` null用來表示尚未存在的對(duì)象,

面試官:很正確镇防,再出個(gè)問題給你啦鸣,問題如下:

<pre style="margin: 0px; padding: 0px; 
white-space: pre-wrap;
 overflow-wrap: break-word; 
font-family: &quot;Courier New&quot; 
!important; font-size: 12px !important;">
var F=function(){};

Object.prototype.a=function(){
     console.log('a()')
};

Function.prototype.b=function(){
     console.log('b()')
} var f=new F();

f.a()//?
f.b()//来氧?
F.a()//诫给?
F.b()//?</pre>

應(yīng)聘者:答案應(yīng)該為a()啦扬、報(bào)錯(cuò)找不到b這個(gè)函數(shù)中狂、a()、b()扑毡。(如果你能瞬間回答出這個(gè)答案就代表你已經(jīng)了解原型和原型鏈了)

面試官:看來原型原型鏈也難不倒你了胃榕,那面試就到這里告一段落了。

三.總結(jié)

閉包和原型原型鏈的介紹就到這里介紹了瞄摊,如果上面有哪些解釋有錯(cuò)誤麻煩大家指正一下勋又,謝謝了苦掘!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市楔壤,隨后出現(xiàn)的幾起案子鹤啡,更是在濱河造成了極大的恐慌,老刑警劉巖蹲嚣,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件递瑰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡隙畜,警方通過查閱死者的電腦和手機(jī)抖部,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來议惰,“玉大人慎颗,你說我怎么就攤上這事』幌” “怎么了哗总?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)倍试。 經(jīng)常有香客問我讯屈,道長(zhǎng),這世上最難降的妖魔是什么县习? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任涮母,我火速辦了婚禮,結(jié)果婚禮上躁愿,老公的妹妹穿的比我還像新娘叛本。我一直安慰自己,他們只是感情好彤钟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布来候。 她就那樣靜靜地躺著,像睡著了一般逸雹。 火紅的嫁衣襯著肌膚如雪营搅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天梆砸,我揣著相機(jī)與錄音转质,去河邊找鬼。 笑死帖世,一個(gè)胖子當(dāng)著我的面吹牛休蟹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼赂弓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绑榴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盈魁,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤彭沼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后备埃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褐奴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年按脚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敦冬。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辅搬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脖旱,到底是詐尸還是另有隱情堪遂,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布萌庆,位于F島的核電站溶褪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏践险。R本人自食惡果不足惜猿妈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巍虫。 院中可真熱鬧彭则,春花似錦、人聲如沸占遥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓦胎。三九已至芬萍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凛捏,已是汗流浹背担忧。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坯癣,地道東北人瓶盛。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親惩猫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芝硬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)轧房。 注意:講述HT...
    kismetajun閱讀 27,474評(píng)論 1 45
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,097評(píng)論 1 32
  • 3月22日 1. DOM操作——怎樣添加拌阴、移除、移動(dòng)奶镶、復(fù)制迟赃、創(chuàng)建和查找節(jié)點(diǎn)? 創(chuàng)建新節(jié)點(diǎn)createDocumen...
    福爾摩雞閱讀 2,454評(píng)論 0 12
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級(jí)和職位的變化厂镇,入門級(jí)到專家級(jí)纤壁,廣度和深度都會(huì)有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,580評(píng)論 0 7
  • 幾年前參加一個(gè)澳洲本地朋友的圣誕聚會(huì),席間來了一對(duì)長(zhǎng)輩迄靠。老太太已經(jīng)92歲了秒咨,身材消瘦、頭發(fā)雪白掌挚,眼睛卻是又大又亮雨席,...