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

这个题怎么解

阅读 2k
1 个回答

给你格式化了下。

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

var a = fun(0)
a.fun(1);  
a.fun(2);  
a.fun(3);

1、申明变量 a 赋值为 fun(0) 的返回值,
2、函数执行,执行第一句 console.log(o) 但是 参数o 并没有传入,所以输出 undefined
3、继续执行,返回一个对象,属性fun为匿名函数接收一个 m
4、所以最后变量 a 被赋值为这个对象
5、继续往后看,执行a.fun(1),执行fun方法传入0,返回 fun(m,o)的结果,m 为传入的 1, n 为闭包中的 n(既上一次传入的 0),
6、执行函数fun(步骤2)输出o的值,既 0,继续执行,返回一个对象
但是返回的变量并没有赋值给变量,其实没有被保持,所以闭包内的变量o还是最初申明变量a传入的0,
那么之后的 a.fun(2)a.fun(2) 和一开始的a.fun(0) 的结果其实是一样的。


接下来看 b 段,一段链式调用,所以就和 a段有一点不一样了。
我把你的代码修改一下有助于你理解

function fun(n,o) {
  console.log(o) 
  return {
    method:function(m){ 
        return fun(m,n);
    }
  };
} 
var b = fun(0).method(1).method(2).method(3);

其实就是在执行每一次返回对象上的 method 方法,这个时候代入参数就不一样了,每一次的 fun函数 中的 o会根据上一次的执行结果而改变。
一下子不知道该怎么描述了,上一段伪代码吧

var b = fun(0).method(1).method(2).method(3);
// 其实可以理解等价于
var b = fun(0);
b = b.method(1);
b = b.method(2);
b = b.method(3);

按照 a 段的理解,就是每次步骤6返回的都赋值给变量b了。所以后续每一次执行的时候,闭包内的 变量o 都是上一次传入的值。
所以依次输出的结果为 undefined, 0 ,1 , 2


最后的c段我不想说了,你结合以上两端自己理解下就好了,就是赋值给C的时候其实闭包内的变量0为第二次传入的值1
所以执行的结果应该为 undefined, 0 ,1 , 1

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