你們好,本人來在掘金待了有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)
時m
爲2
,因此仍是閉包了第一次調用時的n,因此內部調用第一層的fun(2,0);因此o爲0函數
4.再來看第一句第四條調用語句:a.fun(3)
時m
爲3
,因此仍是閉包了第一次調用時的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);
請輸出上面這條語句的輸出結果。
補充的題目的答案我會在評論區給出
大佬們若是發現了文中的錯誤,及時在評論區指出,我會及時修改!
若是以爲對您有用請點個贊,謝謝大佬!