上一篇文章談論了閉包的概念和一些應用,並給出一個例題,這篇文章就此道例題進行討論。
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);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1); c.fun(2); c.fun(3);
問:三行a,b,c的輸出分別是什麼?
首先來看第一行
var a = fun(0)
;undefined
;a.fun(1)
;fun(0, undefined).fun(1)
;a.fun(1)
返回的就是fun(m, n)
;fun(1, 0)
;因此打印的值為0
,;a.fun(2)
;fun(2, 0)
,依然打印0
;a.fun(3)
;fun(3, 0)
,依然打印0
;undefined,0,0,0
第二行
var b = fun(0)
undefined
;.fun(1)
fun(1, 0)
, 打印0
;.fun(2)
.fun(2)
,弄明白了上面,你一定知道這一步應該返回的是fun(2, 1)
;因為此時在內存中的n是1;所以打印值為1;.fun(3)
2
,即fun(3, 2)
;打印2
;undefined,0,1,2
第三行就是一二行的結合,如果弄懂了上面兩行,第三行不過是一個驗證的過程。也就不在多說。
輸出為 undefined,0,1,1