实在是不懂,求大神解释,谢了
javascript吧
全部回复
仅看楼主
level 7
叶辉宇2 楼主
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 6
http://www.cnblogs.com/renlong0602/p/4223852.html 我写的这个博客有讲这个的
2015年01月21日 03点01分 2
level 8
为什么我觉得你解释的很清楚啊?
2015年01月21日 04点01分 3
这是我复制的
2015年01月21日 05点01分
但有些地方我不理解,比如说它参数是怎么传进去的。因为实参有多个括号,而形参只有括号。
2015年01月21日 05点01分
可以解释一下下吗
2015年01月21日 05点01分
回复
Ҷ����2
:在JS中,函数的调用有两种:add函数中,第一种是直接add(),第二种是 表达式+()。在给函数传参的时候当解释器分析add(1)的调用,是第一种,然后返回一个函数,此时第二个()前是表达式,然后后面在连接()后,即为第二种调用,比如这种形式的(function(){})(),即为函数的第二种调用。
2015年01月21日 06点01分
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
谢谢你
2015年01月21日 07点01分
受我一拜
2015年01月21日 07点01分
真棒👍看懂了!
2021年02月23日 07点02分
太***
2021年04月06日 16点04分
level 7
叶辉宇2 楼主
此贴已真相大白
2015年01月21日 07点01分 6
level 12
2015年01月21日 07点01分 8
反正画了,就放著吧
2015年01月21日 07点01分
好详细的图,软件工程的一个工具耶!谢谢,真的谢谢
2015年01月21日 07点01分
回复
Ҷ����2
: 一般是绝对不会画这麼详细的呢
2015年01月21日 07点01分
真给力
2015年01月21日 14点01分
level 7
叶辉宇2 楼主
谢谢各位前辈,叶某感激。说真的,很感动!我想我以后也会为别人这么解答,像你们一样
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
2021年04月09日 05点04分 12
level 1
add 的参数是不是没有作用?能去掉吗
2025年05月09日 06点05分 13
level 1
你可以去我经常学习的一个资源网站看看,猿学谷,应该对你学习比较有帮助
2025年06月26日 06点06分 14
level 2
哇,15年的帖子,十年后还有人解答。
2025年07月01日 19点07分 15
level 8
[呵呵]
2026年01月16日 02点01分 16
1