level 7
function add(x) {
var sum = x;
var tmp = function (y) {
sum = sum + y;
return tmp;
};
tmp.toString = function () {
return sum;
};
return tmp;
}
console.log(add(1)(2)(3)); //6
console.log(add(1)(2)(3)(4)); //10
首先要一个数记住每次的计算值,所以使用了闭包,在tmp中记住了x的值,第一次调用add(),初始化了tmp,并将x保存在tmp的作用链中,然后返回tmp保证了第二次调用的是tmp函数,后面的计算都是在调用tmp, 因为tmp也是返回的自己,保证了第二次之后的调用也是调用tmp,而在tmp中将传入的参数与保存在作用链中x相加并付给sum,这样就保证了计算;
但是在计算完成后还是返回了tmp这个函数,这样就获取不到计算的结果了,我们需要的结果是一个计算的数字那么怎么办呢,首先要知道JavaScript中,打印和相加计算,会分别调用toString或valueOf函数,所以我们重写tmp的toString和valueOf方法,返回sum的值;
2015年01月21日 03点01分
1
level 12
楼主别再读这人的文了,一个句号都没有。他也许 JS 不错,不过中文似乎比我这个"外国人"还差呢。
2015年01月21日 04点01分
4
上课时,抽空写的,文笔不好。
2015年01月21日 04点01分
回复迪斯尼鼻祖:看完你这个,我还是没有理解我发的那个程序
2015年01月21日 06点01分
回复
��˹������
: 不是说你啦 o_o
2015年01月21日 06点01分
回复
Ҷ����2
:当一个函数在输出的时候,会调用函数的toString()函数,所以console.log(add(1)(2)(3));其实可以分开为两步 : var result=(add(1)(2)(3)).toString(); console.log(result);
2015年01月21日 06点01分
level 8
举例add(1)(2)(3),代码执行add(1)的时候,声明了add函数的局部变量sum并赋值为1,同时返回子函数tmp,这样add(1)(2)(3)就相当于tmp(2)(3),因为tmp函数需要用的sum这个变量,使得add执行完毕之后并没有清除sum这个局部变量的数据。这样执行tmp(2)的时候将2与sum相加保存在sum上,同时返回自身tmp。这时sum为3,tmp(2)(3)就相当于tmp(3),然后运行tmp(3),把3与sum相加保存在变量sum上,同时返回tmp。这时add(1)(2)(3)运行之后结果是tmp函数(sum=6),而用console.log()函数显示结果的时候会将里面的内容自动转换为字符串,所以console.log(tmp)相当于console.log(tmp.toString()),而这个toString()函数被重定义为return sum,所以结果就是console.log(sum)//6,以此类推如果后面还有括号那么sum将继续加下去到最后剩下tmp然后运行toString()返回结果。
2015年01月21日 06点01分
5
真棒👍看懂了!
2021年02月23日 07点02分
level 7
谢谢各位前辈,叶某感激。说真的,很感动!我想我以后也会为别人这么解答,像你们一样
2015年01月21日 07点01分
9
level 11
举例add(1)(2)(3),代码执行add(1)的时候,声明了add函数的局部变量sum并赋值为1,同时返回子函数tmp,这样add(1)(2)(3)就相当于tmp(2)(3),因为tmp函数需要用的sum这个变量,使得add执行完毕之后并没有清除sum这个局部变量的数据。这样执行tmp(2)的时候将2与sum相加保存在sum上,同时返回自身tmp。这时sum为3,tmp(2)(3)就相当于tmp(3),然后运行tmp(3),把3与sum相加保存在变量sum上,同时返回tmp。这时add(1)(2)(3)运行之后结果是tmp函数(sum=6),而用console.log()函数显示结果的时候会将里面的内容自动转换为字符串,所以console.log(tmp)相当于console.log(tmp.toString()),而这个toString()函数被重定义为return sum,所以结果就是console.log(sum)//6,以此类推如果后面还有括号那么sum将继续加下去到最后剩下tmp然后运行toString()返回结果。
2015年01月21日 07点01分
10
是的,add(1)的时候,tmp=function()根本就没有运行,函数里面又没有被调用,自然不会运行了。所以就不存在sum=sum+x的运行情况。只有等到tmp作为返回值之后,才被外部的调用,才开始所谓的tmp=function(x)的运行,才会有sum+x 的运行发生。
2020年11月17日 00点11分
level 10
第一次调用的是add()方法,这时sum=1;因为add()最后return temp,所以第二次调用的是temp()方法,2就传到temp那里去了,这时sum=sum+2;因为temp()也是return temp;所以第三次sum=sum
+3
2020年11月24日 04点11分
11
level 1
你可以去我经常学习的一个资源网站看看,猿学谷,应该对你学习比较有帮助
2025年06月26日 06点06分
14