javascript经典闭包问题
PHPz
PHPz 2017-04-11 09:07:15
[JavaScript讨论组]

问题:

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);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);//undefined,?,?,?

答案:

//答案: //a: undefined,0,0,0 //b: undefined,0,1,2 //c: undefined,0,1,1

看了挺久,似懂非懂,无法理出正确清晰的解释思路,求大牛解答。

PHPz
PHPz

学习是最好的投资!

全部回复(4)
ringa_lee

感觉原 po 说的很详细了啊 http://www.cnblogs.com/xxcang...

我晕,居然发现我也写过题解 ... http://www.cnblogs.com/zichi/...

高洛峰

谢邀,这问题其实不难理解吧,觉得太深入的话,建议草稿写起来。

首先看 a = fun(0),此时输出的是undefined,这个假设题主是知道的, 此时a其实就是一个对象:

{
    fun:function(m){
       return fun(m, 0);
    }
}

所以啊后面的a.fun(x)其实都是在调用对象里面的fun方法,而fun方法还是调用外面那个声明的fun函数,但是我们不需要理解太深,只要知道 fun(x,y)的时候 ,会输出y 即可 ,所以啊,这里a.fun 都是输出 0;

那么我们先跳过b先看c,在我们刚才理解a.fun的基础上,它这里其实就相当于

c = a.fun(1);

我们知道刚才a实际上就是一个对象,包含fun方法,现在是要调用a.fun然后返回一个新的对象了

我们想一下调用a.fun(1)的时候,其实返回的是 return fun(1, 0);
这个时候我们忘记a,看一下fun函数是怎么执行fun(1,0)的,是不是输出1,然后返回一个新的对象,然后赋值给了c了。如下

{
    fun:function(m){
       return fun(m, 1);
    }
}

这个时候我们按照前面a.fun方法调用的方式,其实这时候c.fun(z),就是都输出1了。

这时候相信我们掌握了一个规律,实际上就是我们只要知道最后一层fun函数调用的参数n,就知道最后输出的是啥了。

于是我们简化一下b,结合a跟c的例子

b = c.fun(2).fun(3);

我们知道c.fun()是输出 1的,以此类推, c.fun(2).fun(3)应该输出的是2 ~

ps: 实际写代码好像没遇到过这种

PHP中文网

看起来好像听绕的样子,其实把第二句翻译一下就完了。

var b = fun(0).fun(1).fun(2).fun(3);
相当于
var b1 = fun(0);
var b2 = b1.fun(1);
var b3 = b2.fun(2);
b3.fun(3);
PHPz

关键字是 柯里化

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号