位置: 编程技术 - 正文

JavaScript的函数式编程基础指南(JavaScript的函数库)

编辑:rootadmin

推荐整理分享JavaScript的函数式编程基础指南(JavaScript的函数库),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:JavaScript的函数中只能写一条代码语句,JavaScript的函数库,javascript的函数定义允许嵌套,JavaScript的函数中只能写一条代码语句,JavaScript的函数中只能写一条代码语句,JavaScript的函数中只能写一条代码语句,JavaScript的函数名称中可以包含$符号,javascript的函数定义允许嵌套,内容如对您有帮助,希望把文章链接给更多的朋友!

引言

JavaScript是一种强大的,却被误解的编程语言。一些人喜欢说它是一个面向对象的编程语言,或者它是一个函数式编程语言。另外一些人喜欢说,它不是一个面向对象的编程语言,或者它不是一个函数式编程语言。还有人认为它兼具面向对象语言和函数式语言的特点,或者,认为它既不是面向对象的也不是函数式的,好吧,让我们先搁置那些争论。

让我们假设我们共有这样的一个使命:在JavaScript语言所允许的范围内,尽可能多的使用函数式编程的原则来编写程序。

首先,我们需要清理下脑子里那些关于函数式编程的错误观念。

在JS界被(重度)误解的函数式编程

显然有相当一批开发者一天到晚的以函数式范式的方式使用JavaScript。我还是要说有更大量的JavaScript开发者,并不真正理解那佯做的真正意义。

我确信,导致这种局面是因为很多用于服务端的web开发语言都源自C语言,而C语言,很显然不是一种函数式编程语言。

似乎有两个层级的混乱,第一个层级的混乱我们用下面这个在jQuery中经常会用到的例子来说明:

嘿,仔细看。我传递一个匿名函数作为参数,这在JavaScript世界里被称作众所周知“CallBack”(回调)函数。

真有人会认为这就是函数式编程吗?根本不是!

这个例子展示了一个函数式语言的关键特性:函数作为参数。另一方面,这个3行代码的例子也违背了几乎所有其他的函数式编程范式。

第二个层级的混乱有点微妙。读到这里,一些追求潮流的JS开发者在暗自思考。

好吧,废话!但是我已经知道了所有关于函数式编程的知识与技能。我在我所有的项目上使用Underscore.js。

Underscore.js 是一个广受欢迎的JavaScript库,到处都在使用。举个例子,我有一组单词,我需要获得一个集合,集合里的每个元素是各个单词的头两个字母。用Underscore.js实现这个相当简单:

看!看JavaScript巫术。我正在使用这些高级的函数式应用函数,像_.map 和 _.first。你还有什么要说的,利兰(译注:作者Leland)?

尽管underscore 和 像_.map这样的函数是非常有价值的函数式范式,但是像这个例子中所采用的组织代码的方法看起来…冗长而且对于我来说太难于理解。我们真的需要这样做吗?

如果开始思考的时候多一点“函数式”的思维,可能我们能够把上面的例子改成这样:

仔细想想,在1行代码中包含了和上面5行代码同样的信息。words 和word 仅仅是参数/占位符。这个方法的核心是用一种更明显的方式组合map函数,first函数,和常量2。

JavaScript是函数式编程语言吗?

没有神奇的公式能够判定一种语言是不是“函数式”语言。有些语言很明显就是函数式的,就像另外一些语言很明显不是函数式的,但是有大量语言的是模棱两可的中间派。

于是这里给出一些常用的、重要的函数式语言的“配料”(JavaScript能实现用粗体标志)

函数是“第一等公民” 函数能够返回函数 词法上支持闭包 函数要“纯粹” 可靠递归 没有变异状态

这决不是一个排它的列表,但是我们至少要逐个讨论Javascript中最重要的三个特性,它们支撑我们可以用函数式的方式来编写程序。

让我们逐个详细的了解下:

函数是“第一等公民”

这条可能是在所有的配料中最明显的,并且可能是在很多现代编程语言中最常见到的。

在JavaScript局部变量是通过var关键字来定义的。

JavaScript中把函数以局部变量的方式定义是非常容易做到的。

这些都是事实,变量:变量add和变量even通过被赋值的方式,与函数定义建立引用关系,这种引用关系是在任何时候如果需要是可以被改变的。

当然,这没有什么特别的。但是成为“第一等公民”这个重要的特性使得我们能够把函数以参数的方式传递给另一个函数。举个例子:

JavaScript的函数式编程基础指南(JavaScript的函数库)

这是一个函数,他接受了一个二元函数f,和两个参数a,b,然后调用这个二元函数f,该二元函数f以a、b为输入参数。

这样做看起来有点笨拙,但是当把接下来的函数式编程“配料”合并考虑的时候,牛叉之处就显而易见了…

函数能返回函数(换个说法“高阶函数”)

事情开始变的酷起来。尽管开始比较简单。函数最终以新的函数作为返回值。举个例子:

这个函数(applyFirst)接受一个二元函数作为其中一个参数,可以把第一个参数(即二元函数)看作是这个applyFirst函数的“部分操作”,然后返回一个一元(一个参数)函数,该一元函数被调用的时候返回外部函数的第一个参数(f)的二元函数f(a, b)。返回两个参数的二元函数。

让我们再谈谈一些函数,例如mult(乘法)函数:

依循mult(乘法)函数的逻辑,我们可以写一个新的函数double(乘方):

这就是偏函数,在FP中经常会用到。(译注:FP全名为 Functional Programming 函数式程序设计 )

我们当然可以像applyFirst那样定义函数:

现在,我想要一个double(乘方)函数,我们换种方式做:

这种方式被称作“函数柯里化”。有点类似partial application(偏函数应用),但是更强大一点。

准确的说,函数式编程之所以强大,大部分因于此。简单和易理解的函数成为我们构筑软件的基础构件。当拥有高水平的组织能力、很少重用的逻辑的时候,函数能够被组合和混合在一起用来表达出更复杂的行为。

高阶函数可以得到的乐趣更多。让我们看两个例子:

1.翻转二元函数参数顺序

2.创建一个组合了其他函数的函数

这个例子创建了一个实用的函数,我们可以使用它来记录下每次函数调用。

词法闭包+作用域

我深信理解如何有效利用闭包和作用域是成为一个伟大JavaScript开发者的关键。那么…什么是闭包?

简单的说,闭包就是内部函数一直拥有父函数作用域的访问权限,即使父函数已经返回。<译注4>可能需要个例子。

一旦createCounter函数被调用,变量count就被分配一个新的内存区域。然后,返回一个函数,这个函数持有对变量count的引用,并且每次调用的时候执行count加1操作。

注意从createCounter函数的作用域之外,我们是没有办法直接操作count的值。Counter1和Counter2函数可以操作各自的count变量的副本,但是只有在这种非

常具体的方式操作count(自增1)才是被支持的。

在JavaScript,作用域的边界检查只在函数被声明的时候。逐个函数,并且仅仅逐个函数,拥有它们各自的作用域表。(注:在ECMAScript 6中不再是这样,因为let的引入)

一些进一步的例子来证明这论点:

关于作用域还有一些重要的事情需要考虑。例如,我们需要创建一个函数,接受一个数字(0-9),返回该数字相应的英文名称。

简单点,有人会这样写:

但是缺点是,names定义在了全局作用域,可能会意外的被修改,这样可能致使digit_name1函数所返回的结果不正确。那么,这样写:

这次把names数组定义成函数digit_name2局部变量.这个函数远离了意外风险,但是带来了性能损失,由于每次digit_name2被调用的时候,都将重新为names数组定义和分配空间。换个例子如果names是个非常大的数组,或者可能digit_name2函数在一个循环中被调用多次,这时候性能影响将非常明显。

这时候我们面临第三个选择。这里我们实现立即调用的函数表达式,仅仅实例化names变量一次,然后返回digit_name3函数,在 IIFE (Immediately-Invoked-Function-Expression 立即执行表达式)的闭包函数持有names变量的引用。这个方案兼具前两个的优点,回避了缺点。搞定!这是一个常用的模式用来创建一个不可被外部环境修改“private”(私有)状态。

简单理解JavaScript中的封装与继承特性 JavaScript中的封装封装简单地说就是让外界只能访问对象的共有变量和函数,隐藏细节和数据。js中有三种方法创建对象,分别为门户大开型、用命名规

javascript实现dom元素可拖动 摘要:最近在项目中要做一个图片预览的功能,这时候会遇到用户上传很大的图片,已经超出视图界面。最终决定做一个在固定宽和高的位置,用户可

javascript的几种继承方法介绍 1.原型链继承:构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型

标签: JavaScript的函数库

本文链接地址:https://www.jiuchutong.com/biancheng/369996.html 转载请保留说明!

上一篇:javascript 继承学习心得总结(javascript继承原理)

下一篇:简单理解JavaScript中的封装与继承特性(简单理解贴现)

  • 增值税发票税控开票软件怎么下载
  • 固定资产税前一次性扣除
  • 负数怎么在excel里输入
  • 2020年个税申报流程视频
  • 如何确定固定资产的原始价值
  • 变更法人代表要查征信吗
  • 利息费用和利息支出的区别计算公式
  • 收购票怎么做会计分录
  • 不能收回的应收票据
  • 进项税加计抵减生产性服务
  • 填仓2021
  • 代开的增值税专用发票应怎样填写?
  • 票据贴现业务利润怎么算
  • 商贸公司购进农产品可以抵扣吗
  • 上个月未抵扣忘记做进项会计分录
  • 电子商务支付平台有哪些
  • 房地产开发公司注册条件
  • 先付一半款财务应该怎么写
  • 一次性收到跨期租赁费会计分录
  • 筹备期会计分录
  • 税控服务费全额抵扣文件
  • 保险代理的佣金怎么算
  • 公司注册资金未实缴可以申请破产吗
  • 申报是不是就是报税
  • 税控盘服务费每年都可以抵吗
  • 小微企业需要到哪里报税
  • 当期亏损需要提企业所得税吗财务报表
  • 物流公司进项票多了,可以帮人开票吗
  • 计算所得税时扣除增值税附加怎么算
  • 购买方开具红字信息表
  • 1697510586
  • 办公室椅子固定
  • 重装系统后出现ctrl+alt+del
  • windows10右键刷新有点卡
  • linux 引导
  • 发票上下联开具的金额不符怎么处罚
  • chart.js教程
  • 企业付给个人工资怎么做
  • framework怎么用
  • 商业一般纳税人增值税税负率最低多少
  • 玄学2021
  • webform前端
  • python字符串多行
  • 没有数字的公章有效吗
  • 投资现金流负值表示什么
  • 养殖类合作社
  • 拍卖车牌收入需要缴纳什么税
  • 简易计税怎么算增值税
  • 坏账损失的定义
  • 投资收益在什么科目
  • 折旧费用分摊科目是什么
  • 个人所得税计算方法2023计算器
  • 固定资产减值准备一经计提不得转回
  • 坏账准备的余额百分比法
  • 工程施工企业的会计科目如何设置
  • 发票超过定额了怎么处理
  • 从一个公司到另一个公司叫什么
  • 销售额是营业额吗?
  • windows7用户
  • win10周年版
  • windowssystem32configsystem下载
  • freebsd怎么安装软件
  • mac电脑系统安装
  • imac 5k屏幕参数
  • wfxsnt40.exe - wfxsnt40是什么进程
  • win7怎么打开程序
  • 此电脑右键
  • win8图标放桌面
  • unitysharder
  • 虚拟现实国内做的最好的
  • 批处理 输出换行
  • python开发软件教程
  • js中的?
  • 网页过关类游戏
  • javascript教程完整版
  • jquery js区别
  • 玉林税务局班子成员
  • 江苏国税,地税怎么交
  • 失业金存在多个账户
  • 新疆税务总局网站官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设