javascript 纯函数 柯里化回顾

javascript 纯函数 柯里化回顾,第1张

1、纯函数

a、确定的输入,一定会产生确定的输出
b、函数在执行过程中,不能产生副作用

var names = ["abc", "cba", "nab", "a"];

// slice, 只要传入一个start/end
// slice函数本身不会修改原来的数组
// slice就是一个纯函数
var newNames = names.slice(0, 3);
console.log(newNames);
console.log(names);

// splice不是纯函数
var newNames2 = names.splice(2);
console.log(newNames2);
console.log(names);


// baz也不是纯函数,因为我们修改了传入的参数
function baz(info) {
  info.age = 23
}
var obj = {
  name: 'chen',
  age: 34
}
baz(obj);
console.log(obj);

console.log('============');
// 下面这个test是纯函数
function test(info) {
  return {
    ...info,
    age: 123
  }
}
test(obj)
console.log(obj);
2、柯里化 2.1、柯里化过程和代码结构
function foo(a, b, c, d) {
  return a + b + c + d;
}
let f = foo(1, 2, 3, 4);
console.log(f);

// 柯里化过程
// 方式一:
function a(a) {
  return function b(b) {
    return function c(c) {
      return function d(d) {
        return a + b + c + d;
      };
    };
  };
}
let a1 = a(1)(2)(3)(4);
console.log(a1);

// 简化上面的代码,
var bar = (a) => (b) => (c) => (d) => {
  return a + b + c + d;
};
console.log(bar(10)(20)(30)(40));

var bar2 = (a) => {
  return (b) => {
    return (c) => {
      return (d) => {
        a + b + c + d;
      };
    };
  };
};
console.log(bar(10)(20)(30)(40));
2.2、柯里化作用


1、柯里化单一原则:

function add(x, y, z) {
  x = x + 2;
  y = y * 2;
  z = z - 2;
  return x + y + z;
}
console.log(add(1, 2, 3));

// 柯里化:单一职责原则
function sum(x) {
  // 业务代码一
  x = x + 2;
  return function (y) {
    // 业务代码二
    y = y * 2;
    return function (z) {
      // 业务代码三
      z = z - 2;
      return x + y + z;
    };
  };
}
console.log(sum(1)(2)(3));

2、柯里化-逻辑的复用:

function sum(a, b) {
  return a + b;
}

// 如果我们需要把5和另外一个数字进行相加
console.log(sum(5, 11));
console.log(sum(5, 12));
console.log(sum(5, 13));
console.log(sum(5, 14));

// 柯里化
function makeAdder(count) {
  return function (num) {
    return count + num;
  };
}

var result = makeAdder(5)(13);
console.log('result', result);

// 对上面的进行复用
var add5 = makeAdder(5)
add5(11)
add5(12)
add5(13)

3、自动柯里化函数的实现:

function add(a, b, c) {
  return a + b + c;
}

function fnCurrying(fn) {
  function curried(...args) {
    // 判断当前已经接受的参数个数 和 参数本身需要接受的参数是否已经一致 fn.length是可以拿到函数需要的参数的长度的
    
    // 1.当传入参数大于等于需要的参数是,执行函数
    if (args.length >= fn.length) {
      // fn(...args)
      // fn.call(this, ...args)
      return fn.apply(this, args);
    } else {
      // 参数不够,继续接受
      function curried2(...args2) {
        return curried.apply(this, [...args, ...args2]);
      }
      return curried2;
    }
  }
  return curried;
}

var curryAdd = fnCurrying(add);

// add(10, 20, 30)
console.log(curryAdd(10, 20, 30)); 
console.log(curryAdd(10)(20)(30));
console.log(curryAdd(10, 20)(30));

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/941213.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存