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

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

阅读 3.5k
4 个回答

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

首先看 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: 实际写代码好像没遇到过这种

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

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);

关键字是 柯里化

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题