實現如下語法的功能: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請仔細思考,此處不詳解!

本題解答完畢!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM