关于一道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。
我的思路是:
1、fun(0)打印undefined,这个和正确答案一样没什么好说的。
2、然后是a.fun(1),这个和正确答案也一样,虽然也是0但是思路已经不对了,我理解的是闭包中再次调用fun改变原来的值了所以这次打印0,正确解法看下面。
3、我开始觉得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没影响。
执行过程图示:
图示

你可能感兴趣的:(javascript,闭包)