實現add(1)(2)(3)-利用toString和函數柯里化


// 利用了會自動調用toString方法
// 具體和valueOf了解可以看https://blog.csdn.net/FE_dev/article/details/77151434
function add(m) {
  var temp = function(n) {
    return add(m + n);
  }

  temp.toString = function() {
    return m;
  }

  return temp;
}
add(1)(2)(3); // 6

  



// 這句話道出了精髓:用閉包把參數保存起來,當參數的數量足夠執行函數了,就開始執行函數。 // 引用:https://github.com/mqyqingfeng/Blog/issues/42 var curry = function(fn) { // 獲取非fn參數數組 var args = [].slice.call(arguments, 1); return function() { var allArgs = [...args, ...[].slice.call(arguments)]; return fn.apply(this, allArgs); } } // 指定固定的參數 function add(a, b) { console.log(a + b); return a + b; } var addCurry = curry(add, 1, 2); addCurry(); // 1 + 2 var addCurry = curry(add, 1); addCurry(2); // 1 + 2 var addCurry = curry(add); addCurry(1, 2); // 1 + 2 addCurry(1)(2); // 但是還沒有達到具體的預期,我們要實現多個參數函數轉換一系列使用單個參數的函數 var sub_curry = function(fn) { // 獲取非fn參數數組 var args = [].slice.call(arguments, 1); return function() { var allArgs = [...args, ...[].slice.call(arguments)]; return fn.apply(this, allArgs); } } var curry = function(fn, length) { // 獲取函數的參數個數 var len = length || fn.length; return function() { var args = [].slice.call(arguments); // 如果參數的數量匹配函數的參數,即執行函數 if (args.length === len) { return fn.apply(this, args); } else { // 參數的數量和匹配函數的數量不匹配時,擠破腦袋想怎么把(1, 2)(3)湊成(1, 2, 3) // (1, 2)(3)湊成(1, 2, 3)也就時如上第一版,這里取名為sub_curry var combined = [fn].concat([].slice.call(arguments)); // combined就如同上面的arguments return curry(sub_curry.apply(this, combined), len - arguments.length); // } } } var addCurry = curry(function(a, b, c) { console.log(a + b + c); return a + b + c; }); addCurry(1, 2, 3); // 6 addCurry(1, 2)(3); // 6 addCurry(1)(2)(3); // 6 addCurry(1)(2, 3); // 6

  


免責聲明!

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



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