标签:
开博客有一段时间了,一直没动笔,原因是确实没看到什么值得写的内容。直到今天在司徒正美的博客里看到一个问题。
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的特点,来完成输出值的目的。也可以算成是对象方法的重写的一个应用。
标签:
原文地址:http://www.cnblogs.com/zhangdongming/p/5361569.html