JavaScript中函数的无限次运算问题

开博客有一段时间了,一直没动笔,原因是确实没看到什么值得写的内容。直到今天在司徒正美的博客里看到一个问题。

http://www.cnblogs.com/rubylouvre/archive/2012/02/15/2351991.html

function add(x) {________}; alert(add(2)(3)(4)); //填空,使结果为9

add函数有点柯里化的意思。其实这道题本身并不难,我之前刷题的时候也遇到过这道题,当时的解法是类似于上面链接里的解法二。

但是一直以来我都不认为这是一个好的解法,因为这样add函数就只能接受三个数相加。

而正美大大的解法了参数数量的问题

//司徒正美
function add (a){
                if(!isFinite(add.i)){
                    add.i = a
                }else {
                    add.i += a;
                }
                add.valueOf = add.toString = function(){
                    return add.i
                }
                return add;
            }
            alert(add(2)(3)(4))

其实这类无限加法的问题要解决的最大的问题就在于返回值:如果想要实现连续函数执行就需要return add;但是问题在于这样写的话函数就不知道什么时候我不再输入数字了。在腾讯某前端团队出的《JavaScirpt设计模式》中柯里化一节中的一个例子中也有这个问题,它的处理方法是如果不写形参直接执行就代表输入完毕,该输出结果了。(e.g. add(1)(2)(3)())而在这里正美大大的处理方法是利用了alert方法的特性:如果参数不是String,那么就会默认的调用对象的toString方法,在toString方法中实现返回值的作用。不过有一点让我困惑的是为什么为什么同时重写了valueOf方法,后来我找到了这篇文章:

http://www.jb51.net/article/34843.htm

大家看第二段代码就可以了,大概的意思是alert调用的也不一定就是toString方法,有的时候调用的是valueOf。但是对于什么时候是toString什么时候是valueOf,还需要进一步研究。

我选择这篇文章来探讨的主要原因是这段代码巧妙利用了一个alert默认调用toString的特点,来完成输出值的目的。也可以算成是对象方法的重写的一个应用。