Javascript 连续调用单参函数实现任意参函数
函数 add 可以实现连续的加法运算
函数 add 语法如下 add(num1)(num2)(num3)...;
//注意这里是省略号哟,可无限
使用举例如下:
add(10)(10); // 20
add(10)(20)(50); // 80
add(10)(20)(50)(100); // 180
var add30 = add(10)(20); // 30
var add100 = add30(30)(40); // 100
var add31 = add30(1); // 31
var add40 = add31(9); // 40
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
@bf 老师的答案非常棒,学习了。不过我想@bf 老师实际上还是搞反了 currying 和 uncurrying。
currying 是将参数提前保存以在下一次调用时不必提供此参数,@bf 老师的代码所做的正是这个工作。而 uncurrying 则是将原来设定好的参数腾出来,使之可以被函数调用者重新设定。在 JavaScript 中常用于将 obj.func(x, y, z, ...)转变为 func(org, x, y, z)。这样做的好处是可以方便地应用 Duck Type
这种特性。@bf 老师后面提供的 curry 代码其实才是真正的 uncurry。(@bf 菜菜已經將自己的答案 reverse 到 r4,which fits the en wikipedia)
另,
如下代码也可以很好的工作(其实还是一种 currying,将每次的和绑定到下次调用,这样就可以连加了):
实际上就是要把每一次函数调用的结果都区分开而已。
返回一个返回自身的函数,就可以做到无限调用。
reversed to r4; nonsense was deleted.
這道題考得是柯里化。
这个问题叫做柯里化(curry),不是勇士的库里。柯里化就是预先将函数的某些参数传入,得到一个简单的函数,但是预先传入的参数被保存在闭包中。
具体可以看看这个实现curry
我没记错的话这个是这题吧,原题应该是 CodeWar 上的。
首先,完全按照题目实现,根本实现不了,add(1)(2)如果返回3,add(1)(2)(3)必然报错。
我们退一步,实现add(1)(2)()返回3,add(1)(2)(3)()返回6。
有两种方法,第一种是每次调用都计算出中间结果,最后无参数调用时把结果返回,另一种是把加数都记下来,无参数调用时执行加法并返回。
第一种:
第二种:
问他想考你什么
如果想考闭包,和函数式,和原型继承那就写给他,如果他不说
那么直接写个window.sum=0和function add()气死他
那么,就写个靠谱(~~并不靠谱,看楼上们)点的答案吧
1.首先需要优雅点的写法,不写成window.var,所以写个闭包
2.然后思考一下函数式累加怎么写,第一步当然是 sum=0+input;
3.这时,得把x扔进子作用域bar才行,不然就记不住这个sum了.然后进一步的累加就交由bar来处理了,理由同上.
4.再把整个结构贯通一下,先运行foo,获得result,交由bar,并且return出bar,return bar后才能继续走下一步
//我发现这里好像是markdown??
5.好了,现在到bar了,这就比较简单了,不用考虑闭包这无聊的事,sum_new=sum_odd + input;接着呢 还要继续累加那么,直接无限调用自身就好了,所以bar:return bar;
6.其实已经完事了,只不过为了应付原型继承这个考点,还要蛋疼的多写一步.这个也是很赖皮的..我就不想写了,反正上面代码都有了.所以我show我喜欢的写法
result :foo(1)(2)(3).show() = 6
唯一的缺点,最后结束时必须再次调用一次。
哪位大神来完善下
网易的考试题...哈哈~
顶上去啊 自己还没想出来!
好像是通过拓展Number.prototype可以解决吧。
那样写扩展性也不好吧。
下面是我的思路。
类似于这种的思路。
调用