为了账号安全,请及时绑定邮箱和手机立即绑定

关于闭包的一个问题

关于闭包的一个问题

POPMUISE 2018-12-01 23:15:03
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,b,c的输出分别是什么?
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

首先看第一句:var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
a = fun(0)给函数fun传递了第一个参数n,第二个参数o为undefined,所以console.log(o)为undefined。然后函数给a返回了属性fun。
a.fun(1)调用了a的属性fun,传递了第一个参数m,然后调用了函数fun,参数为m,n并返回调用结果。此时m=1,而因为闭包,n的值保留了下来,并作为了调用的函数fun的参数n。所以此时a.fun(1)实际上是return fun(1,0);所以console.log(o)输出值为0;
a.fun(2)和a.fun(3)同理。

第二句:var b = fun(0).fun(1).fun(2).fun(3);
fun(0)此时参数n=0,输出undefined并返回了一个属性,这是属性是fun函数,该fun函数只有一个参数m,

fun(1)即调用该fun函数属性,该属性调用了一个新的fun函数,并返回它的值。该fun函数的参数为m,n,此时m=1,n=0;所以输出0;而它返回的值又返回了一个新的fun属性,此时n=1,o=0;

fun(2)即调用该fun函数属性,该属性调用了一个新的fun函数,并返回它的值。该fun函数的参数为m,n,此时m=2,n=1;所以输出1;而它返回的值又返回了一个新的fun属性,此时n=2,o=1;

fun(3)即调用该fun函数属性,该属性调用了一个新的fun函数,并返回它的值。该fun函数的参数为m,n,此时m=3,n=2;所以输出2;而它返回的值又返回了一个新的fun属性,此时n=3,o=2;

第三句:var c = fun(0).fun(1); c.fun(2); c.fun(3);
c = fun(0).fun(1)输出undefined和0,此时n=1,返回了一个属性,这是属性是fun函数,有一个参数m;
c.fun(2)调用了该属性,此时m=2,该属性返回了一个名为fun的函数的值,这个fun函数的两个参数m=2,n=1,所以输出了1;
c.fun(3)调用了该属性,此时m=3,该属性返回了一个名为fun的函数的值,这个fun函数的两个参数m=3,n=1,所以还是输出了1;

emmm说了这么一大堆绕口令,希望对你有帮助。


查看完整回答
反对 回复 2018-12-31
  • 1 回答
  • 0 关注
  • 355 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信