zoukankan      html  css  js  c++  java
  • 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的特点,来完成输出值的目的。也可以算成是对象方法的重写的一个应用。

  • 相关阅读:
    idea + springboot 的java后台服务器通过小米推送
    python编程之禅
    温故而知新-MySQL高级编程
    温故而知新-mysql的一些语法show,describe,explain,fulltext
    温故而知新-PHP文件操作函数
    温故而知新-正则单词和strlen
    php使用tcpdf实现在线PDF功能
    温故而知新-array_walk和sizeof和array_count_values()和extract()
    温故而知新-strtok函数
    mysql中的blob和text区别
  • 原文地址:https://www.cnblogs.com/zhangdongming/p/5361569.html
Copyright © 2011-2022 走看看