关闭

js函数式编程与代码执行效率

时间: 2018-09-06阅读: 1151标签: 代码

偶尔我也有意识的读一些关于函数式编程的文章, 虽然在工作中实践的机会不多, 但我十分喜欢函数式编程的风格. 在现代浏览器中, 使用函数式编程实用且高大上.

函数式编程对应的是命令式编程, 函数式编程的核心当然是对函数的运用. 而高阶函数(Higher-order)是实现函数式编程的基本要素

高阶函数可以将其他函数作为参数或者返回结果。所以js天生就支持函数式编程, 但 java 则不是(最近版本加入了)

下面简单列举一些函数式编程的特性


1, 没有for循环

虽然这根本不是个正经的(真不正经)的函数式特性,但确实是肉眼最容易看出来的特性.就如同用了 for 循环就不是函数式编程了一样

因为函数式编程必定提供替代for循环的方法, 例如随便列举几个大家耳熟能详的方法: forEach, filter, some, every, find, reduce


2,纯函数(pure-function)

纯函数即没有”副作用”的函数. 所谓的副作用是: 函数操作了其自身作用域之外的值.

这个要求对于我这种习惯命令式开发的人有点苛刻, 而且,大部分人都喜欢跨作用域干事.

另外函数式编程也要求: 函数必须要有返回值


3,柯里化(currying)

currying很简单, 就是将一个需要多个参数的函数,转成只需要一个参数(但实际很可能多于1个)的函数. 剩下的参数去哪儿了呢? 先缓存起来了.如:

function peopleAction(name, action) {
    console.log(name, ',', action);
}

function getPeople(name) {
    return function(action) {
        peopleAction(name, action);
    };
}

var john = getPeople('john'); //把名字固定住

john('walk');
john('shout');
john('jump');

可以看出要实现currying, 高阶函数是必不可少的


函数式编程效率

函数式编程会让代码变得简洁干净, 易读, 易于测试, 但无奈的是, 在现有条件下, js中函数式编程会带来效率上的损耗. 见这个测试:

https://jsperf.com/imperative-vs-fuctional-code-test

函数式编程讲究函数拆分, 为了方便重用, 提倡将过程式代码提取成一个个函数, 过程式代码变成了一个个的函数调用. 但对于很多一次性使用的处理逻辑, 没必要这样做.

函数式编程为了简洁, 有时候不得不牺牲性能. 如上面链接中的测试代码, 命令式编程是这样的:

var kittens = []
for (var i = 0; i < cats.length; i++) {
  if (cats[i].months < 7) {
    kittens.push(cats[i].name)
  }
}


函数式是这样的:

var kittens =
  cats.filter(function(cat){return cat.months < 7})
      .map(function(cat) {return cat.name})

因为表面上 filter与map 不能只靠自己一次性达到获取满足条件对象, 又取出其 name 的操作 (其实有, 用 reduce), 所以这里实际上有两个循环: filter一个, map一个, 天生在性能上就有弱势

对这些性能损耗, 只能期待引擎的改进. 但人的智慧总是领先于现状, 现在, 很多知名的函数式编程风格库, 如 lazy.js 与 lodash, 为我们带来了 延时计算, 达成了效率上的飞跃(尤其是在大数据量时), 大家有兴趣自行了解下吧


原文来源:http://jo2.org/functional-programing-and-performance/

站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1060

如何阅读别人的代码?

比起阅读代码,我更喜欢看别人的文章或者书。我喜欢他们跟我面对面的交流,用简单的自然语言或者画图解释他们的思想。有了思想,我自然知道如何把它变成代码,而且是优雅的代码

编写优秀CSS代码的8个策略

编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一。然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性。

js实现进度条代码

现在很多网站会用到进入网站特效,到网页没有加载完成的时候,会有一个loding特效,加载完了之后才能看到页面,今天就带着做一个js进度条效果,今天要做的效果是纯js进度条加载,没有用到框架

被劣质代码“残害”的这些年

都已经 2020 年了,但我们仍然在生产劣质软件。自从计算机诞生以来,已经过去了近 70 年,但我们似乎还没有吸取所有的教训,仍然在犯着重复的错误。

最好的代码是没有代码

不久前,我开始着手清理一个接手过来的项目。因为项目有一些 bug,所以我有足够的自由来重构它。但修复旧 bug 会引入新 bug,于是乎我就陷入了恶性循环。

Js高程:教你如何写出可维护的代码

在平时工作开发中,大部分开发人员都花费大量的时间在维护其他人员的代码。很难从头开始开发新代码,很多情况下都是以他人成果为基础的,或者新增修改需求,自己写的代码也会被其他开发人员调用

看看这些被同事喷的JS代码风格你写过多少?

现在写代码比以前好多了,代码的格式都有eslint,prettier,babel(写新版语法)这些来保证,然而,技术手段再高端都不能解决代码可读性(代码能否被未来的自己和同事看懂)的问题,因为这个问题只有人自己才能解决

a标签中的href怎么调用javascript代码?

JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。在HTML中,<a>标签的href属性用于指定超链接的目标的URL。

如何处理前任程序员留下的代码

作为软件工程师不可避免会遇到的一个场景是:我们在改变或添加一个功能到不是我们创建的、我们不熟悉的、与我们负责的系统部分无关的代码中时,会遇到麻烦。虽然这可能会是一个繁琐而艰巨的任务

优秀的程序员要学会少敲代码,多思考!

如果只把一个字符一个字符地敲代码叫做 Coding,未免悲哀了一点。优秀的项目,编码阶段实际敲代码的时间不会很长;优秀的程序员,大部分时间都用来思考了。这个时候,你就需要学会代码评审,什么?

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!