js经典闭包题

面试官:会闭包么?

you:木问题!!!

面试官:那么做做下面的题吧?

you:。。。(一脸懵逼中...)

        //经典闭包
        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)

不要怕,咱们来个详细解读

1、首先来看第一行

  • 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

2、第二行

  • 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

3、第三行

就是一二行的结合,如果弄懂了上面两行,第三行不过是一个验证的过程。也就不在多说。
输出为 undefined,0,1,1

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值