從湯姆大叔的博客裏看到了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
本題解答完畢!