V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lukeshawn
V2EX  ›  问与答

关于闭包的一个面试题, 这是为什么啊

  •  
  •   lukeshawn · 2020-05-07 10:51:59 +08:00 · 1652 次点击
    这是一个创建于 1449 天前的主题,其中的信息可能已经有所发展或是发生改变。

    function fun(n,o){ console.log(o); return { fun: function(m){ return fun(m,n); } }; }

    var a = fun(0); // undefined , 这个我理解 a.fun(1); // 0, 这是为什么啊

    为什么 a.fun(1)是 0 啊

    7 条回复    2020-05-07 11:33:38 +08:00
    yesterdaysun
        1
    yesterdaysun  
       2020-05-07 10:56:56 +08:00
    因为最开始穿进去的 0, 作为 n, 在 a.fun 的调用中, 又被传到外面的 fun 作为 o 了
    shintendo
        2
    shintendo  
       2020-05-07 11:04:42 +08:00
    a = fun(0) // a == {fun: function(m) {return fun(m,0)}}
    这样看能理解吗?
    lukeshawn
        3
    lukeshawn  
    OP
       2020-05-07 11:16:16 +08:00
    @yesterdaysun 听不懂
    lukeshawn
        4
    lukeshawn  
    OP
       2020-05-07 11:20:11 +08:00
    @shintendo 不理解,有更小白的解释么
    shintendo
        6
    shintendo  
       2020-05-07 11:24:30 +08:00   ❤️ 1
    @lukeshawn ??不理解在哪里
    1. fun(n)的返回值是{ fun: function(m){ return fun(m,n); } }
    2. 所以 fun(10086)的返回值是{ fun: function(m){ return fun(m,10086); } }
    3. 同理 fun(0)的返回值是{ fun: function(m){ return fun(m,0); } }
    4. a = fun(0),所以 a = { fun: function(m){ return fun(m,0); } }
    哪步不理解??
    MisakaTang
        7
    MisakaTang  
       2020-05-07 11:33:38 +08:00
    console.log(o) 打印函数的第二个参数
    var a = fun(0); 使得函数的第二个参数变成了 0
    a.fun() 不管传什么都是打印 0
    简单理解就是 var a = fun(0) 把 fun(n,o)的第二个参数持久化了 后面调用 a.fun(n) 等价于调用 fun(n,0)
    这样解释?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2820 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 15:32 · PVG 23:32 · LAX 08:32 · JFK 11:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.