美文网首页
闭包与柯里化、合成compose

闭包与柯里化、合成compose

作者: janezhang | 来源:发表于2020-09-01 11:28 被阅读0次

闭包

  • 闭包是指函数内部引用了外部的变量,而外部变量的值是可变化的,闭包里的引用的值是随外部变化的。---
  • 闭包允许你引用存在于外部函数中的变量。然而,它并不是使用该变量创建时的值,相反,它使用外部函数中该变量最后的值。
var outter = [];  
function clouseTest () {  
    var array = ["one", "two", "three", "four"];  
    for(var i = 0; i < array.length;i++){  
       var x = {};  
       x.no = i;  
       x.text = array[i];  
       x.invoke = function(){  
           print(i);    //引用了外部的函数,导致
       }  
       outter.push(x);  
    }  
}  
   
//调用这个函数  
clouseTest();  
   
print(outter[0].invoke());  
print(outter[1].invoke());  
print(outter[2].invoke());  
print(outter[3].invoke());  
  1. 这个立即执行函数解决了 闭包的问题,因为立即执行函数的参数传值是 按值传递的,可理解为,变量已经被赋值了另一份给到函数体内保存。
function clouseTest2(){  
    var array = ["one", "two", "three", "four"];  
    for(var i = 0; i < array.length;i++){  
       var x = {};  
       x.no = i;  
       x.text = array[i];  
       x.invoke = function(no){  
           return function(){  
              print(no);  
           }  
       }(i);  //这里它是按值传递的。
       outter.push(x);  
    }    
} 

柯里化(Currying)

柯里化(英语:Currying),又译为卡瑞化加里化,是把接受多个参数函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

所谓"柯里化",就是把一个多参数的函数,转化为单参数函数。

// 柯里化之前
function add(x, y) {
  return x + y;
}

add(1, 2) // 3

// 柯里化之后
function addX(y) {
  return function (x) {
    return x + y;
  };
}

addX(2)(1) // 3

合成(compose)

如果一个值要经过多个函数,才能变成另外一个值,就可以把所有中间步骤合并成一个函数,这叫做"函数的合成"(compose)。

合成的好处显而易见,它让代码变得简单而富有可读性,同时通过不同的组合方式,我们可以轻易组合出其他常用函数,让我们的代码更具表现力。

function f1(arg) {
  console.log("f1", arg);
  return arg;
}
function f2(arg) {
  console.log("f2", arg);
  return arg;
}
function f3(arg) {
  console.log("f3", arg);
  return arg;
}

function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg;
  }
  if (funcs.length === 1) {
    return funcs[0];
  }
  return funcs.reduce((a, b) => (...args) => a(b(...args)));
}

let res = compose(f1, f2, f3)("omg"); //f1(f2(f3("omg")));

console.log("res", res); //sy-log

另一种更好理解的compose

const compose = (...[first, ...second]) => args => {
  let ret = first(args);
  second.forEach(( fn )=>{
    ret = fn(ret);
  })
  return ret;
}

const fn = compose(add,square)
console.log(fn(1, 2))

相关文章

  • 闭包与柯里化、合成compose

    闭包 闭包是指函数内部引用了外部的变量,而外部变量的值是可变化的,闭包里的引用的值是随外部变化的。--- 闭包允许...

  • Swift需要掌握的几个要点

    函数式编程思想实用栗子: Currying(柯里化)书写方式. => 对方法进行变形, 便于重构与精简代码. 闭包...

  • 柯里化与函数合成

    柯里化 柯里化(currying)指的是将一个多参数的函数拆分成一系列函数,每个拆分后的函数都只接受一个参数(un...

  • 浅谈JavaScript闭包与柯里化函数

    1.闭包的概念 在对作用域,作用域链的概念进行讨论时我们知道,一般情况下定义在函数内部的变量在函数外部是不可访问的...

  • 手写实现

    柯里化 curry 参考lodash 4.17.11 API 实现 使用bind拼接参数 使用闭包将变量保存在cu...

  • JS链式加法实现

    方法一 方法二 方法三 方法四 方法五 继承、闭包、递归、柯里化 相关文章 JavaScript链式调用 add(...

  • 认识JavaScript中的函数

    前言:本文将详细的介绍JS中函数的相关概念(包括函数的call stack 、this 、作用域、闭包、柯里化、高...

  • 函数柯里化

    函数柯里化,用于创建已经设置好了一个或多个参数的函数。函数柯里化的基本方法和函数绑定是一样的:使用一个闭包返回一个...

  • JS函数节流和函数防抖

    函数防抖: 之所以返回一个函数,因为防抖本身更像是一个函数修饰,所以就做了一次函数柯里化。里面也用到了闭包,闭包的...

  • 高阶函数、闭包、柯里化--julia例子

    高阶函数及闭包 【本文来源:(https://juliabook.josephjctang.com/content...

网友评论

      本文标题:闭包与柯里化、合成compose

      本文链接:https://www.haomeiwen.com/subject/pnakchtx.html