1、
function sum() { if (arguments.length == 2) { return arguments[0] + arguments[1]; } else if (arguments.length == 1) { var first = arguments[0]; return function (second) { return first + second; }; } } console.log(sum(2, 3)); console.log(sum(2)(3));
打印结果:
5
5
理解:
首先创建了一个sum函数,sum(2,3)调用时,传入了两个参数,分别为2,3,进入函数体内部后,遇到了一个if条件语句:判断参数的个数,为两个参数时:返回两个参数的和,后面的else if不再满足条件跳过,打印5。
第二个调用sum(2)(3),不满足第一个if,因为第一个调用的时sum(2),只有一个参数,sum(2)(3)的意思是sum(2)的返回值再调用并传入参数3,当2传入时,值被保存在first中,并返回了一个函数,这时再把3传入返回的那个函数中把之前first保存的值和传入的参数相加,打印5。
2、
var fn = 90; var o = { fn: function () { console.log(fn); } } console.log(o.fn());
打印结果:
90
undefined
理解:
代码中有一个变量名和函数名重名,函数在对象o中,o访问了成员fn并调用,打印的fn访问的是全局变量fn = 90;因为函数的创建方式是fn:function(){};所以o.fn()不能直接使用函数;如果要直接使用函数,可以写成如下方式:
var fn = 90; var o = { fn: function fm() { console.log(fm); } } console.log(o.fn());
3、
var User = { count: 1, getCount: function () { return this.count; } } var fn = User.getCount; console.log(fn());
打印结果:
undefined
理解:同2
4、
function fun(n, o) { console.log(o) return { fun: function (m) { return fun(m, n); } }; } var a = fun(0); a.fun(1); a.fun(2); a.fun(3); var b = fun(0).fun(1).fun(2).fun(3); var c = fun(0).fun(1); c.fun(2); c.fun(3);
打印结果:
undefined
0
0
0
undefined
0
1
2
undefined
0
1
1
解析:(自己理的,有错请指正)
/* {a:隐式:var n = 0,var o;o打印-->undefined return{fun}; a.fun(1);var m = 1; return{fun(1,0)} var n = 1;var o = 0;打印-->0 return{fun(m)} a.fun(2);var m = 2; return{fun(2,0)} var n = 2,var o = 0;打印-->0; return{fun(m)} a.fun(3);var m = 3; return{fun(3,0)} var n = 3,var o = 0;打印-->0; return{fun(m)} } {b:fun(0).fun(1)-->同上 ;打印-->undefined; fun(0).fun(1);var m = 1; return{fun(1,0)} var n = 1;var o = 0;打印-->0; return{fun(m)} fun(2) return fun(m,n) var m = 2,var n = 1; fun(2,1);var n = 2;var o = 1;打印-->1; return fun(m);var m = 3;n = 2; return fun(3,2); var n = 3,var o = 2;打印-->2; } {c:fun(0).fun(1)-->同上 ;打印-->undefined; return{fun}; c.fun(1);var m = 1; return{fun(1,0)} var n = 1;var o = 0;打印-->0 return{fun(m)};var m = 2;var n = 1 return fun(2,1); var n = 2,var o = 1;打印-->1 return{fun(m)};var m = 3;var n = 1 return fun(3,1); var n = 3; var o = 1;打印-->1 } */