IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> javascript 纯函数 柯里化回顾 -> 正文阅读

[JavaScript知识库]javascript 纯函数 柯里化回顾

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));
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-13 11:40:51  更:2022-05-13 11:42:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:37:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码