問:三行a,b,c的輸出分別是什麼? 首先來看第一行 var a = fun(0);等同於fun(0, undefined),因為未傳遞第二參數,所以列印undefined; a.fun(1);因為閉包的存在,所以n依然在記憶體中存在,所以此式等同於fun(0, undefined).fun(1);所 ...
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)
;
等同於fun(0, undefined),因為未傳遞第二參數,所以列印undefined
;a.fun(1)
;
因為閉包的存在,所以n依然在記憶體中存在,所以此式等同於fun(0, undefined).fun(1)
;
所以a.fun(1)
返回的就是fun(m, n)
;
m是傳進去的參數1,n是記憶體中依然存在的0,所以實際返回的是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(1, 0).fun(2)
,弄明白了上面,你一定知道這一步應該返回的是fun(2, 1)
;因為此時在記憶體中的n是1;所以列印值為1;.fun(3)
和上一步道理相同,n變為2
,即fun(3, 2)
;列印2
;- 所以第二行列印值為
undefined,0,1,2
第三行就是一二行的結合,如果弄懂了上面兩行,第三行不過是一個驗證的過程。也就不在多說。
輸出為 undefined,0,1,1