關於一道javascript閉包練習題的理解

原題:閉包

function fun(n, o) {
            console.log(o);
            return {
                fun: function (m) {
                    return fun(m, n);
                }
            };
        }
        // 考察點1
        var a = fun(0); // ?
        a.fun(1); // ?
        a.fun(2); // ?
        a.fun(3); // ?
        // 考察點2
        var b = fun(0).fun(1).fun(2).fun(3); // ?
        // 考察點3
        var c = fun(0).fun(1); // ?
        c.fun(2); // ?
        c.fun(3); // ?

我一看到題目而後給出考察點1的答案是undefined 0 1 2,可是控制檯實際打印是undefined 0 0 0。
個人思路是:
一、fun(0)打印undefined,這個和正確答案同樣沒什麼好說的。
二、而後是a.fun(1),這個和正確答案也同樣,這個也好理解就是閉包中再次調用fun改變原來的值了因此此次打印0。
三、我開始以爲a.fun(2)應該是1,由於這裏再次改變n值了,因此仍是對那個n作了賦值因此應該是1,而實際上上次a.fun(1)打印0是再次調用了fun,因此此時的n是本次調用fun的上下文中的並非a閉包所引用的n,全部之後不管如何調用a.fun(n)都是在新調用的fun中打印的n,對a.fun(n)所屬閉包引用的n沒影響。
執行過程圖示:
圖示spa

相關文章
相關標籤/搜索