经典面试题分析

题目

function fun(n, o) {
    console.log(o)
    return {
        fun: function(m) {
            return fun(m, n);
        }
    };
}
var a = fun(0);  //undefined
a.fun(1);        //0
a.fun(2);        //0
a.fun(3);        //0
var b = fun(0).fun(1).fun(2).fun(3);
                //undefined
                //0
                //1
                //2
var c = fun(0).fun(1);
                //undefined
                //0
c.fun(2);       //1
c.fun(3);       //1

先分析一下这个函数fun的代码结构,有两个形参n、o打印o的值。返回值为一个对象,该对象有一个属性fun,该属性的值是一个匿名函数,有一个形参m,这个匿名函数的返回值在调用最外层的函数fun,并且传入了两个实参m、n;

  1. Var a=fun(0),调用最外层函数,并且传入一个参数0,进入函数代码块,首先用var 声明两个形参,此时第一个参数n=0,第二个参数o没有赋值,所以打印undefined

    1)  fun(1), 因为外层函数的返回值是一个对象,这里通过对象调用方法,并传入一个实参1,此时m=1,然后返回值继续调用外层函数fun,并将m、n的值1,0作为形参传入即fun(1,0),此时n=1,o=0,打印o的值,所以打印0
    2)  a.fun(2), 因为外层函数的返回值是一个对象,这里通过对象调用方法,并传入一个实参2,此时m=2,然后返回值继续调用外层函数fun,并将m、n的值2,0作为形参传入即fun(2,0),此时n=2,o=0,打印o的值,所以打印0
    3)  a.fun(3), 因为外层函数的返回值是一个对象,这里通过对象调用方法,并传入一个实参2,此时m=2,然后返回值继续调用外层函数fun,并将m、n的值2,0作为形参传入即fun(2,0),此时n=2,o=0,打印o的值,所以打印0
    
  2. var b = fun(0).fun(1).fun(2).fun(3);使用var声明一个变量为b,并将等号右边的调用的结果赋给b

    1)  fun(0), 调用最外层函数,并且传入一个参数0,进入函数代码块,首先用var 声明两个形参,此时第一个参数n=0,第二个参数o没有赋值,所以打印unfined
    2)  .fun(1), 因为fun(0)的返回值是一个对象,这里通过对象调用方法,并传入一个实参1,此时m=1,然后返回值继续调用外层函数fun,并将m、n的值1,0作为形参传入即fun(1,0),此时n=1,o=0,打印o的值,所以打印0
    3)  .fun(2), 因为fun(1)的返回值是一个对象,这里通过对象调用方法,并传入一个实参2,此时m=2,然后返回值继续调用外层函数fun,并将m、n的值2,1作为形参传入即fun(2,1),此时n=2,o=1,打印o的值,所以打印1
    4)  .fun(3), 因为fun(2)的返回值是一个对象,这里通过对象调用方法,并传入一个实参3,此时m=3,然后返回值继续调用外层函数fun,并将m、n的值3,2作为形参传入即fun(3,2),此时n=3,o=2,打印o的值,所以打印2
    
  3. var c = fun(0).fun(1);使用var声明一个变量为c,并将等号右边的调用的结果赋给c

    1)  fun(0), 调用最外层函数,并且传入一个参数0,进入函数代码块,首先用var 声明两个形参,此时第一个参数n=0,第二个参数o没有赋值,所以打印undefined
    2)  .fun(1), 因为fun(0)的返回值是一个对象,这里通过对象调用方法,并传入一个实参1,此时m=1,然后返回值继续调用外层函数fun,并将m、n的值1,0作为形参传入即fun(1,0),此时n=1,o=0,打印o的值,所以打印0
    a)  .fun(2), 因为fun(0).fun(1)的返回值是一个对象,这里通过对象调用方法,并传入一个实参2,此时m=2,然后返回值继续调用外层函数fun,并将m、n的值2,1作为形参传入即fun(2,1),此时n=2,o=1,打印o的值,所以打印1
    b)  .fun(3), 因为fun(0).fun(1)的返回值是一个对象,这里通过对象调用方法,并传入一个实参3,此时m=3,然后返回值继续调用外层函数fun,并将m、n的值3,1作为形参传入即fun(3,2),此时n=3,o=1,打印o的值,所以打印1
    

你可能感兴趣的:(经典面试题分析)