• JS闭包经典例题


    上一篇文章谈论了闭包的概念和一些应用,并给出一个例题,这篇文章就此道例题进行讨论。

    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

  • 相关阅读:
    UML序列图
    接口初探
    Discuz初探
    Vim指令学习
    UCenter Home代码研读之space.php
    建站须知
    linux指令之文件的创建、查询、修改
    InitPHP初探
    php环境搭建
    Zend Framework学习之Zend_Db 数据库操作
  • 原文地址:https://www.cnblogs.com/foolgry/p/5309192.html
Copyright © 2020-2023  润新知