美文网首页
前端经典面试题

前端经典面试题

作者: 旸云 | 来源:发表于2018-09-10 17:26 被阅读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

    相关文章

      网友评论

          本文标题:前端经典面试题

          本文链接:https://www.haomeiwen.com/subject/ggasgftx.html