前端经典面试题

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

上一篇下一篇

猜你喜欢

热点阅读