位置: 编程技术 - 正文

使用 JavaScript 进行函数式编程 (一) 翻译(js中调用java)

编辑:rootadmin

推荐整理分享使用 JavaScript 进行函数式编程 (一) 翻译(js中调用java),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js怎么使用,javascriptj,js怎么使用,js怎么使用,js怎么使用,在js中引入js,js中调用java,在js中引入js,内容如对您有帮助,希望把文章链接给更多的朋友!

编程范式

编程范式是一个由思考问题以及实现问题愿景的工具组成的框架。很多现代语言都是聚范式(或者说多重范式): 他们支持很多不同的编程范式,比如面向对象,元程序设计,泛函,面向过程,等等。

函数式编程范式

函数式编程就像一辆氢燃料驱动的汽车——先进的未来派,但是还没有被广泛推广。与命令式编程相反,他由一系列语句组成,这些语句用于更新执行时的全局状态。函数式编程将计算转化作表达式求值。这些表达式全由纯数学函数组成,这些数学函数都是一流的(可以被当做一般值来运用和处理),并且没有副作用。

函数式编程很重视以下值:

函数是一等要务

我们应该将函数与编程语言中的其他类对象同样对待。换句话说,您可以将函数存储在变量里,动态创建函数,以及将函数返回或者将函数传递给其他函数。下面我们来看一个例子...

一个字符串可以保存为一个变量,函数也可以,例如:

一个字符串可以保存为对象字段,函数也可以,例如:

一个字符串可以再用到时才创建,函数也可以,例如:

一个字符串可以作为输入参数传给函数,则函数也可以:

一个字符串可以作为函数返回值,函数也可以,例如:

高阶案例

如果函数将其他函数函数作为输入参数或者作为返回值,则称之为高阶函数。刚才我们已经看过了一个高阶函数的例子。下面,我们来看一下更复杂的情况。

例1:

例2:

最爱纯函数

纯函数不会有其他的副作用,所谓的副作用指的是函数所产生的对函数外界状态的修改。比如:

修改某个变量

修改数据结构

对外界某个变量设置字段

抛出例外或者弹出错误信息

最简单的例子就是数学函数。Math.sqrt(4) 函数总是返回2。他不会用到任何其他心寒信息,如状态或者设置参数。数学函数从来不会造成任何副作用。

避免修改状态&#;

函数式编程支持纯粹的函数,这样的函数不能改变数据,因此大多用于创建不可改变的的数据。这种方式,不用修改一个已存在的数据结构,而且能高效的新建一个.你也许想知道,如果一个纯粹的函数通过改变一些本地数据而生产一个不可改变的返回值,是否是允许的?答案是可以。在JavaScript中极少的数据类型是默认是不可改变的。String是一个不能被改变的数据类型的例子:

不可改变状态的好处使用 JavaScript 进行函数式编程 (一) 翻译(js中调用java)

&#; 避免混乱和增加程序的准确性:在复杂系统内,大多数难以理解的Bug是由于状态通过在程序中外部客户端代码修改而导致的。&#; &#; 确立“快速简洁”的多线程编程:如果多线程可以修改同一个共享值,你不得不同步的获取值。这对专家来说都是十分乏味并且易出错的编程挑战。&#;软件事务内存和Actor模型提供了直接在线程安全方式下处理修改。

使用递归而非循环调用

递归是最有名的函数式编程技术。如果您还不知道它的话,那么可以理解为递归函数就是一个可以调用自己的函数。

替代反复循环的最经典方式就是使用递归,即每次完成函数体操作之后,再继续执行集合里的下一项,直到满足结束条件。递归还天生符合某些算法实现,比如遍历树形结构(每个树枝都是一颗小树)。

在任何语言里,递归都是一项重要的函数式编程方式。很多函数语言甚至要求的更加严格:只支持递归遍历,而不支持显式的循环遍历。这需要语言必须保证消除了尾端调用,这是 JavasSrip 不支持的。

惰性求值优于激进计算

数学定义了很多无穷集合,比如自然数(所有的正整数)。他们都是符号表示。任意特定有限的子集都在需要时求值。我们将其称之为惰性求值(也叫做非严格求值,或者按需调用,延迟执行)。及早求值会强迫我们表示出所有无穷数据,而这显然是不可能的。

很多语言都默认是惰性的,有些也提供了惰性数据结构以表达无穷集合,并在需要时对自己进行精确计算。

很明显一行代码 result = compute() 所表达的是将 compute() 的返回结果赋值给 result。但是 result 的值究竟是多少只有其被用到的时候才有意义。

可见策略的选择会在很大程度上提高性能,特别是当用在链式处理或者数组处理的时候。这些都是函数式程序员所喜爱的编程技术。

这就开创可很多可能性,包括并发执行,并行技术以及合成。

但是,有一个问题,JavaScrip 并不对自身进行惰性求值。话虽如此,Javascript 里的函数库可以有效地模拟惰性求值。

闭包的全部好处

所有的函数式语言都有闭包,然而这个语言特性经常被讨论得很神秘。闭包是一个函数,这个函数有着对内部引用的所有变量的隐式绑定。换句话说,该函数对它引用的变量封闭了一个上下文。JavaScript 中的闭包是能够访问父级作用域的函数,即使父级函数已经调用完毕。

声明式优于命令式编程

函数式编程是声明式的,就像数学运算,属性和关系是定义好的。运行时知道怎么计算最终结果。阶乘函数的定义提供了一个例子:

factorial(n) = 1 if n = 1

n * factorial(n-1) if n > 1

该定义将 factorial(n) 的值关联到 factorial(n-1),是递归定义。特殊情况下的 factorial(1) 终止了递归。

从它实现阶乘计算来看,声明式的阶乘可能看起来像“命令式”的,但它的结构更像声明式的。

命令式阶乘使用可变值、循环计数器和结果来累加计算后的结果。这个方法显式地实现了特定的算法。不像声明式版本,这种方法有许多可变步骤,导致它更难理解,也更难避免 bug 。

函数式JavaScript库

有很多函数式库:underscore.js, lodash,Fantasy Land, Functional.js, Bilby.js, fn.js, Wu.js, Lazy.js, Bacon.js, sloth.js, stream.js, Sugar, Folktale, RxJs 等等。

函数式程序员工具包

map(), filter(), 和 reduce()函数 构成了函数式程序员工具包的核心。 纯高阶函数成了函数式方法的主力。事实上,它们是纯函数和高阶函数应该仿效的典型。它们用一个函数作为输入,返回没有副作用的输出。

这些 JavaScript 函数对每一个函数式程序来说都是至关重要的。他们可以去除循环和语句,使得代码更加整洁。这些都是实现 ECMAScript5.1 的浏览器的标准,他们只处理数组。每次调用都会创建创建并返回一个新的数组。已存在的数组不会被修改。但是稍等,事情很不止于此。。。他们还将函数作为输入参数,通常是作为回调的匿名函数。他们会遍历将整个数组并且将该回调函数应用与每一项!

myArray = [1,2,3,4];

newArray = myArray.map(function(x) {return x*2});

console.log(myArray); // Output: [1,2,3,4]

console.log(newArray); // Output: [2,4,6,8]

除了这三个函数,还有很多函数可以扎入到几乎每一个函数式应用里:

forEach(),concat(), reverse(), sort(), every() 以及some().

JavaScript的聚范式

JavaScript当然不是严格意义上的函数式编程语言,这也促使了对其他范式的使用:

命令式编程:基于详细操作描述式的编程

基于原型的面向对象式编程:基于原型对象及其实例的编程

元程序编程:操纵JavsScript执行模型的编程方式。对元程序编程的一个很好的定义描述为“编程发生在您书写代码做某事的时候,而元程序编程则发生在您书写代码导致某事的解释方式发生变化的时候。

原文地址: 祝青, 李中凯

jquery 实现输入邮箱时自动补全下拉提示功能 记得去年做某个项目的时候,用到了邮箱输入自动提示功能,于是网上搜了一下,发现了这个写得不错,现在回想起来,转载一下,方便查阅。邮箱的

javascript日期格式化方法汇总 方法一://对Date的扩展,将Date转化为指定格式的String//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q)可以用1-2个占位符,//年(y)可以用1-4个占位符,毫秒(S)

JS+CSS相对定位实现的下拉菜单 本文实例讲述了JS+CSS相对定位实现的下拉菜单。分享给大家供大家参考。具体如下:这里使用的是相对定位,不过效果还可以,用时候再修整一下,这

标签: js中调用java

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

上一篇:Clipboard.js 无需Flash的JavaScript复制粘贴库

下一篇:jquery 实现输入邮箱时自动补全下拉提示功能(jquery 输入框输入完触发事件)

  • 研发费用加计扣除75%还是100%
  • 劳务合同印花税税目
  • 税务会计师报考科目
  • 货物运输费用怎么算
  • 分公司可以享受小规模纳税人优惠
  • 产成品和半成品如何盘点
  • 小规模纳税人教育费附加和地方教育费附加减免
  • 生产成本里面的工资
  • 小微企业减免所得税额是怎么算出来的
  • 公司奖金没有按时发可以要吗
  • 所得税一般纳税人几个点
  • 三栏式和多栏式的账目有哪些
  • 开办费如何做纳税调增
  • 预付账款属于什么账户
  • 管理费用的明细科目怎么写
  • 因质量出问题的事件
  • 报企业所得税的利润总额怎么填
  • 拆迁安置房建设流程
  • 个税个人所得税返回
  • 五证合一后地税编码怎么查
  • 承租方出售资产的行为
  • 企业筹建期的工会金费怎么入账
  • 公司的汽车购置税怎么交
  • 期间损益结转怎么结转
  • 电子承兑到期提示付款选择线上还是线下
  • 专项应付款形成资产怎么处理账?
  • 销售收入大于纳税申报销售收入
  • 银行融资成本计算方法
  • 结转已经销售商品成本
  • 生产企业出口退税全部流程
  • 在win7系统中文件属性有哪些
  • linux bt命令
  • register.exe - register进程有什么用.是什么意思
  • cpqeadm.exe是什么进程 可以关闭吗 cpqeadm进程查询
  • mtask.exe - mtask是什么进程 有什么用
  • win7旗舰版叫啥
  • php bi
  • 有关增值税的计算真题
  • echarts bi
  • 快递行业一般纳税人税率是多少
  • open开放的意思吗
  • php返回上一级
  • 暂估入库后发票来不了
  • discuz论坛账号
  • 固定资产处置科目有哪些
  • 社保公司承担部分计入哪个科目
  • 增值税普通发票查询
  • 企业补助怎么做会计分录
  • 织梦系统网站搭建教程
  • 公司用车租赁
  • 取得土地使用权所支付的金额包括契税吗
  • 年末未分配利润计算公式
  • 会计已入账是什么意思
  • 个人账户转公司账户附言写什么
  • 会计中为什么要用黑色笔写
  • 测绘费计入什么明细科目
  • 会计凭证审核的主要内容
  • 担保贷款借款人死亡
  • 结算金额和付款金额
  • 滞留专票会有什么风险
  • mysql工作内容
  • mysql 左链接 右链接
  • winxp中网桥Bridge功能概述及配置注意事项
  • 怎么查显卡信息
  • win7还原按钮
  • win7系统纯净版64位无法修改窗口颜色怎么办?Win7窗口颜色修改详细步骤
  • windows7安全更新服务
  • 全面了解自我,接纳和包容自我
  • perl ne
  • 根据安全生产法的规定,生产经营单位
  • node.js入门教程
  • 初识年岁尚温柔 小说 免费
  • jquery ztree选中节点颜色
  • Python装饰器基础详解
  • android 动态化方案
  • python网络编程从入门到精通
  • 在地税局工作是什么编制
  • 拉萨税务局拉巴卓玛
  • 江西医保在线缴费
  • 税控系统技术维护费每年都要交吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设