关于闭包的一个问题

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的输出分别是什么?

POPMUISE
浏览 356回答 1
1回答

素胚勾勒不出你

首先看第一句: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说了这么一大堆绕口令,希望对你有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript