1. 程式人生 > >實現類似add(1)(2)(3)的函數

實現類似add(1)(2)(3)的函數

例如 解決問題 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)的函數