一个小故事引发的讨论:JavaScript中使用函数式编程

前言

昨天的文章中提到了一个小插曲, 故事的由来是我微信中的一个"小老板"忽然来了个不可言喻的表情(Little (small) boss "SB..."??? 哈哈 仍是简称小吧)。而后开始了下面的对话:前端

  • 小: 最近TM的好烦
  • 我: 怎么了 boss
  • 小: 我写的代码最近新增了业务 改动起来 牵一发而动全身。心态有点小炸裂。
  • 我: 具体怎么个状况?让小老弟帮你排排忧。
  • 小: 以前不是刚独立负责项目吗,从0到1实现起来感受也没啥太大的困难。可是呢 最近在原来的基础上新增了点新业务需求须要改动以前的代码。就总遇到一些问题 一个函数内的全局变量改动而后功能不少都失效了 致使须要一直debug追踪到底在哪里使用了。。。
  • 我: 我通常拿到项目/产品需求以后在写代码前会花大量事件思考设计 可能比例7:3甚至8:2;经验是一方面。思考仍是很重要的。回到你的问题 就说你前期没作好一些工做例如:编码设计;总体模块划分;工程类框架(作一些单元测试,覆盖率测试..)等等措施,今天给你聊一下具体如何解决这些小问题!!

我展开了一系列装逼和舔的操做....编程

回到今天文章的主题介绍一下编程范式,以及如何在JavaScript中使用起来。安全

什么是编程范式 ?

编程范式(Programming paradigm)是指计算机中编程的典范模式或方法。微信

编程范式主要包含:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)...数据结构

命令式编程:

命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先作什么再作什么。框架

好比:若是你想进行一个变量与变量组合的输出,你须要这样告诉计算机:编程语言

  1. 第一步: 建立一个变量(名字) name;
  2. 第二步: 建立一个变量(问候语) greeting;
  3. 第三步: console.log输出
var name = "wlove"; //声明
   var greeting = "hello, I'm ";//声明
   console.log(greeting + name);//输出 hello, I'm wolove

声明式编程:

声明式编程是以数据结构的形式来表达程序执行的逻辑。它的主要思想是告诉计算机应该作什么,但不指定具体要怎么作。日程最接近的就说网页编程中用到的 HTML 和 CSS 都属于声明式编程。(解释一下:HTML/CSS它们的编写其实就是结构化的 不会具体告诉计算机作什么细节内容。因此属于声明式编程Declarative programming;其实和不少配置文件很类似。)ide

最直接举例就是SQL函数式编程

SELECT * FROM table WHERE num < 5

经过观察声明式编程的代码咱们能够发现它有一个特色是它不须要建立变量用来存储数据。
另外一个特色是它不包含循环控制的代码如 for, while。函数

函数式编程:

函数式编程和声明式编程是有所关联的,由于他们思想是一致的:即只关注作什么而不是怎么作。但函数式编程不只仅局限于声明式编程。

函数式编程最重要的特色是”函数第一位",即函数能够出如今任何地方,好比你能够把函数做为参数传递给另外一个函数,不只如此你还能够将函数做为返回值。很重要一点;若是你使用得当这种编程只须要考虑输入输出的一个流。什么对象(原型)以及其的反作用(相互做用影响)都不须要考虑。

提及函数式编程 可能接触别的语言的朋友 一下就会回忆起 Haskell,Clojure这些语言。其实大部分常见的编程语言都已经提供了对这种编程方式的支持;好比今天的主角JavaScript

相比于之前的命令式编程;声明式编程,我更偏向于使用函数式编程。首先我实验过面向对象(原型)的方式来进行编程。很困惑或者说很痛苦;每一次的 debug至关的提神醒脑;其次函数式编程可让代码的逻辑更清晰更优雅;更安全。( 总之我的用起来就说很爽)

JavaScript的函数式编程几个介绍:

提及函数式编程最基本须要考虑side effect(无反作用)和pure(纯);若是按这样去实现就能合理的解决小老板的一个很重要的问题 debug一个变量一直跟踪哪里修改了...;

//例子1 纯函数
function greet(name){
    return "hello I'm " + name;
}
greet("wlove") // hello I'm wlove


//例子2 非纯函数  用到了外部的变量
var name = "wlove"
function _fn(name){
    return pre + str
}
greet(name)// hello I'm wlove

函数式编程还有一个特色高阶函数(也是提高的一个重要知识点);函数能够做为一个函数的返回。

//高阶函数:
function greet(greeting){
    return function(name){
        return greeting + " " + name
    };
}
var GREETING = greet("hello I' m");
GREETING("wlove"); // "hello I' m  wlove"

函数式编程还有一个须要思考的问题;若是说每次都从新生成一个Copy对象(举个例子 若是输入的参数是array);每次改变从新生成一个。那样会增长空间的使用。如何解决这个问题? 你们能够思考一下或者查阅一些资料。留言讨论一下。

最后

距离上一篇文章的生活日记: 20210524 平常生活的重复。开会;学习;写代码;跑步;写文章;录视频;逛社区...开心就完事了。

本篇文章主要是由于我特别想帮助(tian)小老板 哈哈;也算是随想随写;欢迎你们留言讨论。后面评论会补充介绍如何有效解决空间问题。

聊完天以后个人小老板就是一顿夸,可是也不知道实践没实践。我得多主动跟人家聊聊天 嘿嘿

下一篇JS引擎,做为前端到底须要认识到什么地步,以及如何学习。

相关文章
相关标签/搜索