题目
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;
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
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
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