关于javascript:爪哇学习笔记函数式编程

5次阅读

共计 1889 个字符,预计需要花费 5 分钟才能阅读完成。

概念

函数式编程是一种编程范式,咱们在其中尝试以纯数学函数格调绑定所有内容。它是一种 申明式的编程格调 。它的次要重点是“解决什么”,而命令式格调的次要重点是“如何解决”。 它应用表达式而不是语句 。计算表达式以产生值,而执行语句以调配变量。
函数式编程基于 Lambda 演算。而且,Lambda 演算的函数能够承受函数作为输出参数和输入返回值。

特点

纯函数

这些函数有两个次要属性。首先,它们总是为雷同的参数产生雷同的输入,而不论其余任何事件。其次,它们 没有副作用,即它们不批改任何参数或部分 / 全局变量或输出 / 输入流。起初的属性称为不变性。纯函数的惟一后果是它返回的值。它们是确定性的。

let arr = [1, 2, 3, 4, 5];

arr.slice(0, 3); // [1, 2, 3]
arr.slice(0, 3); // [1, 2, 3]

arr.splice(0, 3); // [1, 2, 3]
arr.splice(0, 3); // [4, 5]

// slice 会扭转参数,而 splice 会扭转,所有 slice 是纯函数,而 splice 不是

递归

函数式语言中没有“for”或“while”循环。函数式语言中的迭代是通过递归实现的。递归函数重复调用本人,直到达到根本状况。

援用通明

援用通明(Referential transparency),指的是函数的运行不依赖于内部变量或 ” 状态 ”,只依赖于输出的参数,任何时候只有参数雷同,援用函数所失去的返回值总是雷同的。

函数是一等的并且能够是高阶的

一等(first class)函数被视为一等变量。第一类变量能够作为参数传递给函数,能够从函数返回或存储在数据结构中。高阶函数是将其余函数作为参数的函数,它们也能够返回函数。

变量是不可变的

在函数式编程中,咱们不能在变量初始化后对其进行批改。咱们能够创立新变量——但咱们不能批改现有变量,这的确有助于在整个程序运行时保护状态。一旦咱们创立了一个变量并设置了它的值,咱们就能够齐全确信该变量的值永远不会扭转。

高阶函数

在数学和计算机科学中,高阶函数 至多满足下列一个条件 的函数:

  • 承受一个或多个函数作为输出
  • 输入一个函数

咱们说闭包也是高阶函数,因为闭包输入了一个函数,满足高阶函数的第二个条件。

function square(x) {return x*x;}
// add 承受一个函数为输出,是高阶函数
function add(x, y, fn) {return fn(x) + fn(y);
}
add(10, -20, square); // 500

函数柯里化

坷里化(Currying)是把承受多个参数的函数变成承受一个繁多参数(最后函数的第一个参数)的函数,并且返回承受余下的参数且返回后果的新函数的技术。

function add(a, b, c) {return a + b + c;}
let foo = function(a) {return function(b) {return function(c) {return a + b + c;}
    }
}
foo(1)(2)(3); // 6

// 形象
function foo(fn, ...args1) {return function(...args2) {return function(...arg3) {return fn(..args1, ...args2, ...args3);
        }
    }
}
foo(add, 1)(2)(3);

// 主动坷里化
function foo(fn, ...args) {if (args.length >= fn.length) {return fn(...args);
    }
    return function(...args2) {return foo(fn, ...args, ...args2);
    }
}

偏函数

固定某个函数的一个或几个参数,返回一个新的函数,用来接管剩下的参数,这个返回的新函数就是偏函数。

function add(a, b, c) {return a + b + c;}
function newAdd = add.bind(null, 1);
newAdd(2, 3); // 6

面试相干

通过更优雅的形式实现纯函数的解耦

let compose = (f, g) => (x => f(g(x)));

let add1 = x => x + 1;
let mul5 = x => x * 5;

compose(mul5, add1)(2); // 15

// 面试题 - 数组长度未知的状况下,拿到最初一项
let first = arr => arr[0];
let reverse = arr => arr.reverse();

let last = compose(first, reverse);

last([1, 2, 3, 4, 5]); // 5

参考文档:

  • Functional Programming Paradigm
  • 函数式编程初探
正文完
 0