从汤姆大叔的博客里看到了6个基础题目:本篇是第6题 - 实现以下语法的功能:var a = add(2)(3)(4); //9html
解题关键:add()函数须要返回一个加法函数,而不是一个普通的值,即定义add(),并想办法让add()返回一个add()。js最显著的特征就是函数的返回值能够是一个函数。函数
实现办法:spa
第1步:在add()体内定义一个fn,该fn返回一个add()。add传递第1个加数,fn传递第2个加数,返回add时,将两个加数之和传递给add,这样就实现了累加。code
第2步:定义add()的返回值为fnhtm
如此一来,就变成了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时,天然就获得了这段定义的代码。那么如何才能获得咱们要的那个值呢?blog
回看fn函数的定义,它返回的是一个add函数,并将a+b的值做为add的参数,那么时此的add的参数,不正就是累加的总和吗?(请仔细思考)换句话说,就是add中的a,老是保存着累加的和。那咱们要如何获得这个值呢?get
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请仔细思考,此处不详解!io
本题解答完毕!