js實現相似於add(1)(2)(3)調用方式的方法

羣裏有人說實現相似add(1)(2)(3)調用方式的方法,結果立刻有人回答:css

  1. var add = function(a){
  2. return function(b){
  3. return function(c){
  4. return a+b+c;
  5. };
  6. };
  7. };
  8.  
  9. add(1)(2)(3); //6

沒錯!那要是add(1)(2)(3)(4) 這樣4個調用呢,那這個確定不適用了。
閉包

這種就是相似於執行一個函數返回函數自身值:
  1. function add(x) {
  2. var sum = x;
  3. var tmp = function (y) {
  4. sum = sum + y;
  5. return tmp;
  6. };
  7. tmp.toString = function () {
  8. return sum;
  9. };
  10. return tmp;
  11. }
  12. console.log(add(1)(2)(3)); //6
  13. console.log(add(1)(2)(3)(4)); //10

首先要一個數記住每次的計算值,因此使用了閉包,在tmp中記住了x的值,第一次調用add(),初始化了tmp,並將x保存在tmp的做用鏈中,而後返回tmp保證了第二次調用的是tmp函數,後面的計算都是在調用tmp, 由於tmp也是返回的本身,保證了第二次以後的調用也是調用tmp,而在tmp中將傳入的參數與保存在做用鏈中x相加並付給sum,這樣就保證了計算;函數

可是在計算完成後仍是返回了tmp這個函數,這樣就獲取不到計算的結果了,咱們須要的結果是一個計算的數字那麼怎麼辦呢,首先要知道JavaScript中,打印和相加計算,會分別調用toString或valueOf函數,因此咱們重寫tmp的toString和valueOf方法,返回sum的值;spa

 

 

摘自:http://www.css88.com/archives/5147#more-5147ip

相關文章
相關標籤/搜索