zoukankan      html  css  js  c++  java
  • 实现如下语法的功能:var a = add(2)(3)(4); //9

    汤姆大叔的博客里看到了6个基础题目:本篇是第6题 - 实现如下语法的功能:var a = add(2)(3)(4); //9

    解题关键:add()函数需要返回一个加法函数,而不是一个普通的值,即定义add(),并想办法让add()返回一个add()。js最显著的特征就是函数的返回值可以是一个函数。

    实现办法:

    第1步:在add()体内定义一个fn,该fn返回一个add()。add传递第1个加数,fn传递第2个加数,返回add时,将两个加数之和传递给add,这样就实现了累加。

    第2步:定义add()的返回值为fn

    如此一来,就变成了add返回fn,而fn又返回了add,这就是变相的add返回add!如下是代码:

    function add(a) {
        var fn = function(b) {
            return add( a+b ); //fn返回的是add函数,并将a与b相加的值传递给add,实现累加
        }
        
        return fn;
    }
    var t = add(1)(2);
    console.log( t );

    运行查看,并没有输出我们预期的结果3,而是输出了 fn 这个函数的定义代码。为什么会这样?不用想太多,本身就是这样。因为add返回的是一个函数,并非一个具体的值,所以输出add时,自然就得到了这段定义的代码。那么如何才能得到我们要的那个值呢?

    回看fn函数的定义,它返回的是一个add函数,并将a+b的值作为add的参数,那么时此的add的参数,不正就是累加的总和吗?(请仔细思考)换句话说,就是add中的a,总是保存着累加的和。那我们要如何得到这个值呢?

    js中console.log一个对象时,会对这个对象进行toString()操作,还有些情况会对对象进行valueOf()操作,那么我们只要让fn的toString()和valueOf()返回的是a的值就可以解决问题,代码如下:

    function add(a) {
        var fn = function(b) {
            return add( a+b ); //fn返回的是add函数,并将a与b相加的值传递给add
        }
        fn.toString = fn.valueOf = function() {
            return a; // 1为什么返回a?   // 2为什么定义fn.toString而不是add.toString?
        }
        return fn;
    }
    var t = add(1)(2);
    console.log( t );

    以上代码中的问题1和问题2请仔细思考,此处不详解!

    本题解答完毕!

  • 相关阅读:
    乘坐飞机时,有什么事情是机长和机上工作人员不想让乘客知道的?
    北京有哪些被废弃的地方值得一看?推荐理由是什么?
    在读硕士或博士是如何养活自己的?
    怎样有效提高记忆力?
    北京值得去的、不为人知的景点(或展览馆、美术馆、公园)有哪些?
    你收藏了哪些藏品?
    如何抓到入侵网站的黑客?
    中国姓氏的区域性?
    python之入门,你好,中国
    Eclipse 内置浏览器
  • 原文地址:https://www.cnblogs.com/langzs/p/6637703.html
Copyright © 2011-2022 走看看