開開森森學前端之閉包筆試題

前言

你們好,本人來在掘金待了有3個多月了,決定跟隨前端大佬們的步伐,故決定記錄本身的成長軌跡,因爲水平有限,對於文章中出現的問題還請大佬們指正。javascript

先來瞄看一眼這個筆試題

function fun(n,o) {
console.log(o) 
return { 
   fun:function(m){ 
     return fun(m,n); 
  } 
 }
} 
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
複製代碼

若是你的反應是: 前端

那就繼續往下看,相反對於絲毫無壓力的童鞋就能夠快樂的去玩耍了!

能夠看到本題考查的知識點主要是閉包!java

分層逐一攻破

var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
複製代碼

1.先來看第一句第一條調用語句:fun(0);毋庸置疑確定是在調用最外層的fun函數,調用時傳了0這個參數,由於最外層的fun函數有兩個形參,傳的時候只傳遞了一個。那麼也就是說這個n對應的是0,那麼顯然o是沒有值的,因此o就是undefined,因此第一次輸出o就是undefined但還須要注意一點,第一條執行完畢後,將他的執行結果賦值給了a變量,由於全局的fun函數裏還return了一個函數,因此咱們稱這種函數爲閉包函數!因此這裏的a如今其實是這樣一個玩意兒:bash

fun:function(m){ 
    return fun(m,n); 
}
複製代碼

2.再來看第一句第二條調用語句:a.fun(1);,注意啦,這裏使用變量a調用了fun,也就是說這裏調用的fun其實是剛剛返回的閉包函數。 那能夠很顯然的看到,這個閉包函數接收一個參數。我們如今只傳遞了一個參數那就是1(因此形參 m = 1),重點又來了,你會發現裏面又return了一個函數,且裏面多了一個參數n,這裏的n實際上是閉包了上面的全局函數fun中的n,由於閉包會建立出一個不被銷燬的做用域,因此n還保留在內存中,那這裏的n的值也就是第一句第一條(fun(0))調用語句接收到的0 因此這裏的m=1,n=0,那剛剛也提到了裏面又return了一個全局函數fun(m,n),因此就是o=0 (o對應的就是全局函數形參中的n)閉包

3.再來看第一句第三條調用語句:a.fun(2)m2,因此仍是閉包了第一次調用時的n,因此內部調用第一層的fun(2,0);因此o爲0函數

4.再來看第一句第四條調用語句:a.fun(3)m3,因此仍是閉包了第一次調用時的n,因此內部調用第一層的fun(3,0);因此o爲0ui

所以能夠看到第一個fun(0)是在調用第一層fun函數。 第二個fun(1)是在調用前一個fun的返回值的fun函數,因此: 後面幾個fun(1),fun(2),fun(3),函數都是在調用第二層fun函數。spa

即: 本題最終執行後的輸出結果爲undefined,0,0,0 code

總結

能夠看到這道題對閉包的考察徹頭徹尾,從始至終都離不開閉包,經過這道題咱們得出結論:建立閉包能夠保存一個或多個變量,供咱們循環利用。 但切記閉包極可能會致使內存佔用過大。所以咱們應該理性的使用閉包給咱們帶來的好處。cdn

好啦,到這裏給你們留一個習題,接着上面的題目,咱們再追加一條調用語句,你們能夠試着本身作一下,作完後能夠參考下面的答案,看本身的結果是否正確

var b = fun(0).fun(1).fun(2).fun(3);

請輸出上面這條語句的輸出結果。

補充的題目的答案我會在評論區給出

大佬們若是發現了文中的錯誤,及時在評論區指出,我會及時修改!

若是以爲對您有用請點個贊,謝謝大佬!

相關文章
相關標籤/搜索