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
这个题怎么解
给你格式化了下。
首先先看
a
段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
段有一点不一样了。我把你的代码修改一下有助于你理解
其实就是在执行每一次返回对象上的
method
方法,这个时候代入参数就不一样了,每一次的fun函数
中的o
会根据上一次的执行结果而改变。一下子不知道该怎么描述了,上一段伪代码吧
按照
a
段的理解,就是每次步骤6返回的都赋值给变量b了。所以后续每一次执行的时候,闭包内的变量o
都是上一次传入的值。所以依次输出的结果为
undefined
,0
,1
,2
最后的
c
段我不想说了,你结合以上两端自己理解下就好了,就是赋值给C的时候其实闭包内的变量0
为第二次传入的值1
,所以执行的结果应该为
undefined
,0
,1
,1