前端经典面试题
2018-09-10 本文已影响0人
旸云
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