function fun(n, o) {
console.log(o);
return {
fun: function (m) {
return fun(m, n)
}
}
}
a = fun(0)
a.fun(1)
a.fun(2)
a.fun(3)
b = fun(0).fun(1).fun(2).fun(3)
c = fun(0).fun(1)
c.fun(2)
c.fun(3)
好了来看看输出什么吧
| Function | Result |
|---|---|
| a = fun(0) | undefined |
| a.fun(1) | 0 |
| a.fun(2) | 0 |
| a.fun(3) | 0 |
| b = fun(0).fun(1).fun(2).fun(3) | undefined;0;1;2 |
| c = fun(0).fun(1) | undefined;0 |
| c.fun(2) | 1 |
| c.fun(3) | 1 |
那么现在问题来了,为什么会有这个输出结果呢,我们先来看代码
function fun(n, o) {
console.log(o);
return {
fun: function (m) {
return fun(m, n)
}
}
}
能够输出的只有console.log(o)这一行,所以我们关注的重点就是它了
当调用a=fun(0)时,console.log(o)输出undefined,如果对此都不了解可以先看一下JavaScript 函数参数
接下来重头戏来了,a.fun(1)调用的是谁呢,经过两次return,实际上调用的是fun(m, n),这样一来就清晰多了,接下来的题目中,只要把题目中的参数带入fun(m, n)就行了。
但是这里要注意闭包
注意代码中的n,由于作用域的关系,n会向子孙级传递。
function fun(n, o) {
^
console.log(o);
return {
fun: function (m) {
return fun(m, n)
^
}
}
}
现在问题就迎刃而解了
a.fun(1)其实就是fun(1,n),由于a = fun(0),所以n = 0
最后实际调用的是fun(1,0),因此console.log(0)的输出自然是0
a.fun(2);a.fun(3)同理
接下来看一下b = fun(0).fun(1).fun(2).fun(3)这一行
首先执行fun(0)和fun(0).fun(1),结果同上
那么当执行完fun(0).fun(1)后,函数内的变量是什么样的呢,是fun(1,0),也就是n=1,o=0
在此基础上执行fun(2)
传入fun(m,n),等于fun(2,1),所以输出为1,然后执行fun(3),等于fun(3,2),输出为2
以上,逻辑就已经捋清了,到了C这一行就太简单了
首先执行c=fun(0).fun(1),结果同上,在此基础上分别执行fun(2)和fun(3)
等价于fun(2,1)和fun(3,1) 所以输出都为1