实现如下语法的功能: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请仔细思考,此处不详解!

本题解答完毕!

原文地址:https://www.cnblogs.com/langzs/p/6637703.html