從湯姆大叔的博客里看到了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請仔細思考,此處不詳解!
本題解答完畢!