当前位置: 首页 > news >正文

(译) 函数式 JS #1:简介

“written equations on brown wooden board” by Roman Mager on Unsplash

原文链接 By: Krzysztof Czernek

简介

如果你是一名 JavaScript 开发人员,那么你很可能会 已经看到过"函数式编程","函子","闭包"或"不变性"等概念了。你可能想知道这些东西到底是什么意思。也许你已经读过一些相关资料。或者你可能正在尝试将一些 FP (Functional Programming) 实践应用到你的代码中。

如果是这样,那么我想我们在同一条船上!

大约两年前,我开始在工作中使用JavaScript。从那时起,我一直在努力加深我对函数式编程的理解。

一开始,每当听到"柯里化(currying)"之类的东西,或者我的同事告诉我"请使用 map 而不是 forEach 并避免这些副作用"的时候,我感到很迷惑。

从那时开始到现在,我已经学到了很多。试图理解 FP 实践是一种非常激动人心的体验-- 到今天依然如此!

现在,我想把我到目前为止所学到的提炼成一系列文章--一些假如我现在从头开始学习 FP 的话自己希望能够读到的系列文章。我希望这能帮助到那些有跟我几年前类似程度和背景的人。


什么是函数式编程?

函数式编程是一种编程范式--- 一种思考和构造代码的方式。它是过程式编程或面向对象编程的替代方案。

FP 爱好者会说他们的目标是优化代码的可重用性,可读性和可测试性。他们工具箱中的常用工具是: 函数(functions),把函数 组合(compose) 起来构建更复杂的功能,以及 避免共享状态(avoiding shared state)副作用(side effects)

如果这些话听起来不知所云 -- 别担心,我们很快就会搞清楚的!

为什么要学习函数式编程?

互联网上有大量的文章讨论为什么函数式编程比面向对象编程更好。如何用它生成更易读,更易于扩展,更易于测试和维护的代码; 什么是声明式(declarative)编程,等等。

我同意其中大部分内容。我不想再重复相同的论点,所以我希望你看一下上面的一些链接。

不过,我接下来要讲的是另外一些东西。我会告诉你为什么要考虑学习函数式编程。我会分享一下我的收获,那也可能将是你的收获。

1. 它正在成为主流

如果你看一下不断变化的 JS 生态,很明显可以看出来函数式编程实践已经日益普及。大量非常酷的新框架和库都受到了 FP 的重大影响, 例如:

  • React -- 可重用的组件和纯函数
  • Redux -- 强迫你不要使用可变状态
  • Reason -- 函数式方法和不变性
  • Elm -- 可以编译成 JavaScript 的函数式语言
  • Underscore.js,lodash 和 Ramda -- 这几个库都内置了 FP

你可能已经或者将要使用这些工具之一。如果你很好地理解了函数式编程的概念,那么你可以更快地掌握这些框架和库。否则你可能要多花一些时间。

2. 这很有挑战性

离开大学之后,你的大脑是不是再也没有像在学校时那样全速运转过了?

我肯定有过。我的意思是,我的工作充满了挑战。我花了很多时间思考:业务问题,系统架构,团队状态以及许多其他东西。

这并不是说跟上微积分课一样。学那个的时候我需要绞尽脑汁来理解所有的概念,以及它们之间如何相互关联。

嗯,学习函数式编程的感觉其实有点儿类似。这也不奇怪,毕竟函数式编程就是来源于数学。

学习过程中会有很多新的术语,理解这些知识可能会让你头晕眼花。但是在醍醐灌顶的时刻,你会体会到极大的满足。

我相信如果你在大学里喜欢数学,那你肯定也会喜欢学习这些东西的。

哦……这个说法可能不会让你爱上函数式编程的,对吧?

3. 这是一个新鲜的东西

我相信,即使你不打算在日常工作中切换到函数式编程,学习新的编程范式也是大有好处的。不仅仅是因为这是一个挑战 -- 更是因为它感觉 很不一样

尝试新的编码风格可以让你接触到另一种截然不同的做事方法。也会迫使你从不同的角度思考问题。

你可能会认为多花一些时间在已经熟练掌握的工具上面更划算。我知道那样收效更快,更务实,可以让你的在那些你熟悉的技术上钻得更

但我相信,作为软件开发者,我们也需要拓我们的视野。它有助于我们更好地与其他开发人员沟通,特别是当他们跟我们背景不同的时候。从不同的角度来看问题,可以帮助我们做出更好的决策。

学习新的编程语言是拓宽专业知识的好方法。但是学习新的编程范式更好。

好的,但……为什么是 JavaScript?

如果你已经决定要学习FP,那么下一个问题就是:使用 JavaScript 是一个很好的方式吗?

首先我得说 JavaScript 可能不是学习函数式编程概念的最佳途径。原因大概有以下这些。

其他更加函数式的语言,内置了不可变数据结构. 而 JavaScript 没有,因此你需要额外使用一个库。这样以来,你的代码会比较冗长。

JavaScript 试图模仿 Java,例如它的 classnew,以及其他一些类似的东西。

JavaScript标准库很糟糕。它当然不是考虑到为 FP 概念而设计的。

关于 JS 是不是函数式编程的最佳选择,还有很多争论。

但是另一方面,JavaScript 也有很多特性有助于实现函数式编程:

  • 函数在 JS 里是一等公民 (First-class functions)
  • 闭包 (Closures)
  • 对象和数组字面量 (Object and Array Literals) (译注:参考)
  • 大量的 FP 库

此外,我认为最重要的一点是:JavaScript 非常流行,并且会越来越流行。

如果你打算使用 JavaScript,为什么不尝试学习一种非常有用的新范式呢?

让我们开始吧!

在本系列的下一部分中,我将介绍一些 FP 概念 - 从最基本的概念开始。我打算涵盖以下几个方面:

  • 纯函数(pure function),一等公民的函数 (first-class functions),高阶函数 (Higher-order functions)
  • 共享状态(shared state),不变性(Immutability),副作用(Side effects),引用透明(Referential transparency)
  • 闭包(Closures)
  • 局部调用(Partial application),柯里化(Currying)
  • 递归(Recursion)
  • 组合(Composition),Point-free 风格
  • FP 库
  • 涵子(Functors),Applicative Functors,Monads

我会假定你已经了解了 JavaScript 的基础知识,ES6 等等。对于理解FP概念来说,这并不是一个强制要求。但是,它可以让你更轻松地完成示例并自己做一些尝试。

准备好了吗,下一章是:“函数式 JS#2:函数”。

相关文章:

  • 独热编码
  • Intellij Idea 关闭自动保存、标记修改未保存文件为星号、修改内存大小
  • 【18】让接口容易被正确使用,不易被误用
  • 【S13】vector和string优先于动态分配的内存
  • java程序调用序列,存储过程,函数等
  • mysql 1
  • Spring系列之手写一个SpringMVC
  • SharePoint中List的大Version和小Version的区别
  • 20名香港大学生结束湖南广电实习 回味“湘遇”之旅
  • 已附件的形式发送测试报告
  • 我与51CTO博客园的第一次
  • PCA降维
  • PHP 全局变量
  • 朋友圈继续扩大!科蓝软件联合蚂蚁金服发布“移动金融逸平台”
  • MySQL面试题之如何优化一条有问题的SQL语句?
  • 【笔记】你不知道的JS读书笔记——Promise
  • Android Volley源码解析
  • Android开源项目规范总结
  • extjs4学习之配置
  • HTTP 简介
  • JAVA_NIO系列——Channel和Buffer详解
  • LeetCode算法系列_0891_子序列宽度之和
  • python docx文档转html页面
  • Tornado学习笔记(1)
  • 开源地图数据可视化库——mapnik
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 在Docker Swarm上部署Apache Storm:第1部分
  • elasticsearch-head插件安装
  • ​2021半年盘点,不想你错过的重磅新书
  • ​queue --- 一个同步的队列类​
  • ​渐进式Web应用PWA的未来
  • $.ajax,axios,fetch三种ajax请求的区别
  • ${factoryList }后面有空格不影响
  • (10)STL算法之搜索(二) 二分查找
  • (8)STL算法之替换
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (力扣)循环队列的实现与详解(C语言)
  • (七)Java对象在Hibernate持久化层的状态
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)ObjectiveC 深浅拷贝学习
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET 服务 ServiceController
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • :中兴通讯为何成功
  • [20190113]四校联考
  • [2021 蓝帽杯] One Pointer PHP
  • [android] 天气app布局练习
  • [AutoSar NVM] 存储架构
  • [BZOJ1008][HNOI2008]越狱
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C++]类和对象【上篇】
  • [C++]类和对象【下】