资讯专栏INFORMATION COLUMN

函数式编程(一)

Pink / 1202人阅读

摘要:函数式编程不是用函数来编程,其主旨是将复杂的函数转化为简单的函数。所以下面用我一年级的智商对函数式编程的理解,来介绍一些函数式编程的知识和概念。

引言

javascript是一门多范式编程语言,什么叫多范式?通俗一点来讲,不管是烂大街的面向对象,还是面向切面、函数式编程啥都能写。函数式编程不是用函数来编程,其主旨是将复杂的函数转化为简单的函数。这两年随着React的火热,函数式编程的概念也开始流行起来,RxJS、cycleJS、lodashJS、underscoreJS等多种开源库都使用了函数式的特性,但是相信绝大部分人看完有关函数式编程的书籍,还是一脸懵逼。所以下面用我一年级的智商对函数式编程的理解,来介绍一些函数式编程的知识和概念。

纯函数

纯函数的定义是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态。

var xs = [1,2,3,4,5];

// 纯的
xs.slice(0,3);
//=> [1,2,3]

// 不纯的,改变了原数组的值
xs.splice(0,3);
//=> [1,2,3]

大多数有用的纯函数都应有至少一个参数。所有有用的纯函数都应该返回一些东西。

let addNoReturn = (x, y) => {
    let z = x+ y
}
//无用的纯函数

现在你可以尝试打开浏览器的控制台,执行这样一个函数

let add = (x, y) =>  x + y 
add(1, 2) //3

执行一次,结果是3。
现在你可以再次执行一次

add(1, 2) //3

结果还是3,再执行一次

add(1, 2) //3

结果还是3,惊不惊喜,意不意外?
再看下面一个函数

let wirteFile = (x) => {
      localStorage.setItem("font", "1")
      return x;
}

这个是纯函数吗,相同的结果也是相同的输出啊?
显然这个不是纯函数,纯函数不能修改任何外部变量,纯函数没有函数副作用
副作用可能包含,但不限于:

更改文件系统

往数据库插入记录

发送一个 http 请求

打印/log

DOM 查询

看到这里你可能会把我拉黑,只有纯函数我还怎么写代码,怎么完成需求?
在函数式编程中,你不仅仅编写纯函数。
函数式语言不能消除函数副作用,它们只能限制函数副作用。因为程序必须和真实世界交互,每一个程序总有一些部分必须是不纯的。目标是减少不纯代码的数量并将它们和我们程序中的其他部分隔离。

纯函数不仅降低了系统的复杂度,还有很多很棒的特性,比如可缓存性

const memorize = f => {
  const cache = {};

  return function() {
    const arg_str = JSON.stringify(arguments);
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};

const addNumber = memorize( x => x + 1)

//第一次计算慢
addNumber(1)
//第二次有了缓存,速度快了不少
addNumber(1)

我们不用每次都自己实现memorize函数,lodash、ramda都提供了很好的封装。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82890.html

相关文章

  • SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数编程

    摘要:函数式编程,一看这个词,简直就是学院派的典范。所以这期周刊,我们就重点引入的函数式编程,浅入浅出,一窥函数式编程的思想,可能让你对编程语言的理解更加融会贯通一些。但从根本上来说,函数式编程就是关于如使用通用的可复用函数进行组合编程。 showImg(https://segmentfault.com/img/bVGQuc); 函数式编程(Functional Programming),一...

    csRyan 评论0 收藏0
  • 编程函数编程

    摘要:声明式编程一种编程范式,与命令式编程相对立。常见的声明式编程语言有数据库查询语言,正则表达式逻辑编程函数式编程组态管理系统等。函数式编程,特别是纯函数式编程,尝试最小化状态带来的副作用,因此被认为是声明式的。 编程范式与函数式编程 一、编程范式的分类 常见的编程范式有:函数式编程、程序编程、面向对象编程、指令式编程等。在面向对象编程的世界,程序是一系列相互作用(方法)的对象(Class...

    noONE 评论0 收藏0
  • 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数编程》- 第 1 章:

    摘要:所以我觉得函数式编程领域更像学者的领域。函数式编程的原则是完善的,经过了深入的研究和审查,并且可以被验证。函数式编程是编写可读代码的最有效工具之一可能还有其他。我知道很多函数式编程编程者会认为形式主义本身有助于学习。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液...

    omgdog 评论0 收藏0
  • 函数编程

    摘要:函数式编程的准则不依赖于外部的数据,而且也不改变外部数据的值,而是返回一个新的值给你。函数式编程利用纯函数的无状态性,它的好处非常多结果可预期利于测试利于复用利于并发,但一个系统工程的代码,是不可能全部采用纯函数来写的。 什么是函数式编程 函数式编程是一种编程范式,常见的编程范式有以下三种: 命令式编程 声明式编程 函数式编程 函数式编程的本质是将计算描述为一种表达式求值。在函数式...

    罗志环 评论0 收藏0
  • javascript 函数编程思想

    摘要:今天这篇文章主要介绍函数式编程的思想。函数式编程通过最小化变化使得代码更易理解。在函数式编程里面,组合是一个非常非常非常重要的思想。可以看到函数式编程在开发中具有声明模式。而函数式编程旨在尽可能的提高代码的无状态性和不变性。 最开始接触函数式编程的时候是在小米工作的时候,那个时候看老大以前写的代码各种 compose,然后一些 ramda 的一些工具函数,看着很吃力,然后极力吐槽函数式...

    YPHP 评论0 收藏0
  • JavaScript 函数编程

    摘要:函数式编程的哲学就是假定副作用是造成不正当行为的主要原因。函数组合面向对象通常被比喻为名词,而函数式编程是动词。尾递归优化函数式编程语言中因为不可变数据结构的原因,没办法实现循环。 零、前言 说到函数式编程,想必各位或多或少都有所耳闻,然而对于函数式的内涵和本质可能又有些说不清楚。 所以本文希望针对工程师,从应用(而非学术)的角度将函数式编程相关思想和实践(以 JavaScript 为...

    hoohack 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<