實現類似add(1)(2)(3)的函數
阿新 • • 發佈:2019-05-14
例如 解決問題 rip addm lock number 暫時 ram 最終
要求實現類似
add(1)(2)(3)
調用方式的方法,例如add為加法函數,則調用add(1)(2)
輸出3,調用add(1)(5)(3)
輸出9。
? 函數的調用方式是多次調用同一個函數,將每次傳入的參數累加,多次函數運算過程中需要記錄之前累加的值。很容易讓我們聯想到閉包,如果調用次數是固定的,我們可以這樣來完成:
var add = function(a) {
return function(b) {
return function(c) {
return a + b + c;
};
};
};
add(1)(2)(3); //6
? 可以看到運用閉包可以依次獲取三次調用的參數,最終返回相加的結果。但如果要調用四次,這個函數就不適用了。如題目要求的不限次數調用,我們是不是可以讓閉包函數返回自身來實現呢?如下:
var add = function(a) {
var sum = a ;
var addMore = function(b) {
sum += b;
return addMore; //addMore函數每次累加後返回自身,繼續累加後面的執行參數。
};
return addMore; //獲取第一個參數賦值給sum後,返回addMore函數。
}
? 理論上這樣就解決問題了,但在調試中我們會發現,當函數調用完畢後,輸出的結果並不是sum,而是addMore函數,因為我們每次調用後都return函數自身。那現在需要解決的問題就是如何讓函數輸出sum值。
? 在網上搜索答案後發現解決方法是:
首先要知道JavaScript中,打印和相加計算,會分別調用toString或valueOf函數,所以我們重寫tmp的toString和valueOf方法,返回sum的值;
addMore.toString = function() {
return sum;
};
? 如上解決方法是改寫addMore閉包函數的toString方法,返回sum值。全部代碼如下:
var add = function(a) {
var sum = a;
var addMore = function(b) {
sum += b;
return addMore;
};
addMore.toString = function() {
return sum;
};
return addMore;
};
add(1)(2)(3)(4); //function 10
var a = add(1)(2)(3)(4).toString(); //10
? 如上代碼的倒數第二行,函數最終返回的值會包含一個function前綴(暫時沒有找到原因,是瀏覽器給出的提示麽?請各位大神指導*0 *);結果再運用toString()函數就可以返回正確的數值。
實現類似add(1)(2)(3)的函數