首页 > 编程知识 正文

js函数式编程概念(js是函数式编程语言吗)

时间:2023-12-04 11:50:03 阅读:312111 作者:YBUG

本文目录一览:

  • 1、js 是更倾向于函数式编程了还是更倾向于面向对象
  • 2、JS函数式编程和递归探索:路由树的操作
  • 3、js 什么是函数式编程
  • 4、前端必学-函数式编程(六)
  • 5、js函数式编程思想就是运算不改变值只是新建值吗?
  • 6、求科普什么是函数式编程语言

js 是更倾向于函数式编程了还是更倾向于面向对象

js 是更倾向于函数式编程,js是弱类型语言,也可以叫解释型语言,开始创建js时倾向于函数式编程。随着js的发展,加入了面向对象的东西,但它是函数式编程。

JS函数式编程和递归探索:路由树的操作

开始切入正题之前,有必要告知大家一下,这篇文章可能有一些深度,初学者可能理解会有些吃力。我会尽量把复杂问题简单化,争取让每个阅读的童鞋们都能看得懂。希望你对element-ui,vue-router,KeepAlive组件有一点了解。现在,我们开始吧。

熟悉element-ui的童鞋们都知道,ElMenuItem和ElSubMenu都需要一个index属性,该属性必须是唯一的。现在,我们想把路由配置直接应用于ElMenu,该如何确保index的唯一性呢?我们需要有一个生成唯一index的函数。如下是genKey函数的定义,是不是很简单?

现在,我们创建addRouteMetaKey函数,该函数对路由树进行递归遍历,为每一个路由配置的meta属性动态添加key字段。这个函数很简单,属于最基础的递归使用例子,我就不做太多解释了。

提示 :数组的forEach方法不是纯函数,因为它有副作用,所以forEach方法不能称之为函数式编程工具。

通过addRouteMetaKey函数,我们可以把路由的meta.key作为index的值了。

现在,我们想实现另一个功能,就是 基于标签页的路由组件缓存控制 。使用过Vuejs KeepAlive组件的童鞋们,应该多多少少都遇到一些坑吧?在我们的项目中,有一个顶部标签页导航,每个tab项对应一个url,以每个url对应路由的title作为tab项标题,当切换tab的时候加载缓存中的url对应的路由组件,关闭tab项,下次打开该路由url,重新挂载对应的路由组件,而不是从缓存中加载。

当路由层级不确定的时候,KeepAlive会变的难以手动控制。所以,我 剑走偏锋,尝试了一种简单的解决方案 ,实践证明: 这是非常有效的 。我的方案就是把无限层级的路由树转化为一维数组。通过为meta添加必要的字段,进行页面结构个性化定制。

我们需要把每层路由配置的path转化为全路径,所以需要一个函数:getRouteFullPath,该函数定义如下:

getRouteFullPath函数中使用到的joinPath函数用于将多个路径字符串拼接为1个完整的路径,定义如下:

现在,我们把路由树转化为一维数组。我们定义toFlatRoutes函数,该函数使用了数组的reduce方法对路由树进行聚合递归,将路由配置中的path属性的值替换为全路径,还顺便给路由配置添加了name属性,返回一个新的一维路由配置数组。 这是函数式编程和递归结合的一个例子。

以上,我们解决了KeepAlive的缓存控制问题;现在,我们又有了一个新的用户体验上的需求,就是我们想根据url对应的路由,自动展开该路由meta.key所属的侧边菜单;我们通过查阅element-ui文档得知,ElMenu有一个open方法,接收index作为参数,展开index对应的菜单。

现在的问题是,我们的路由对应的index是ElMenuItem的,而路由树已经被我们转化为了一维数组,通过路由的matched字段是得不到我们想要的菜单index的。所以, 我们需要遍历原始路由树 。

如下代码,我们定义getMenuKey函数,该函数接收的参数为route对象。如果路由存在,我们进行查找。首先进行简单查找,如果找到一个菜单menu,则返回该菜单的meta.key;如果简单查找无果,则对路由树进行递归查找; 这是函数式编程和递归结合的另一个例子。

现在,我们大功告成了;以上就是本节的知识点,童鞋们理解了吗?只要我们熟悉递归的使用,其实操作树很简单。如果大家还有不懂的,可以评论区问我。感谢阅读!

js 什么是函数式编程

写一个函数(即方法:function),然后去调用这个方法、比如写个C的helloworld然后调用printf就是函数式(过程化)编程,

补充:JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。

在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。

前端必学-函数式编程(六)

我们前篇谈了很多关于【闭包】的理解了,所以你应该会知道,我们现在将要谈的就是 ——【异步】。

我们为什么觉得“异步问题”复杂呢?

其中很重要的一个原因是 —— 时间!时间将我们对数据的操作、管理,变复杂了好几个量级!

(需要特别提出并明确的是: 异步和同步之间是可以相互转化的! 我们使用异步或者同步取决于 —— 如何使代码更加可读!)

函数式编程给出了实现“代码更可读”的落地原则(已多次回顾):

所以我们可以期待,异步在函数式编程中的表现!

上代码:

onCustomer(..) 和 onOrders(..) 是两个【回调函数】释义,两者执行的先后顺序并不能确定,所以它是一个基于时间的复杂状态。

释义:回调函数其实就是一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。

通常来说,我们最先想到的是:把 lookupOrders(..) 写到 onCustomer(..) 里面,那我们就可以确认 onOrders(..) 会在 onCustomer(..) 之后运行。

这样写,对吗?

不对!因为 onCustomer(..) 、 onOrders(..) 这两个回调函数的关系更像是一种竞争关系(都是赋值 customer.orders ), 它们应该并行执行 , 而不是串行执行 。

即:我不管你们谁先执行,谁先执行完,谁就赋值给 customer.orders !

那我们的思路应该是:

不过,这样让代码又变得更加难阅读!!函数内部赋值依赖于外部变量、甚至受外部回调函数的影响。

那究竟怎么办呢?

最终,我们借用 JS promise 减少这个时间状态,将异步转成同步:

两个 .then(..) 运行之前, lookupCustomer(..) 和 lookupOrders(..) 已被同步调用,满足并行执行,谁先结束,谁赋值给 customer.orders ,所以我们不需要知道谁先谁后!

在这样的实现下,不再需要时间先后的概念!减少了时间状态!!代码的可读性更高了!!

这是一个 积极的数组 ,因为它们同步(即时)地操作着离散的即时值或值的列表/结构上的值。

什么意思?

a 映射到 b,再去修改 a ,b 不会收到影响。

而这,是一个 惰性的数组 , mapLazy(..) 本质上 “监听” 了数组 a,只要一个新的值添加到数组的末端(push(..)),它都会运行映射函数 v = v * 2 并把改变后的值添加到数组 b 里。

什么意思?

a 映射到 b,再去修改 a ,b 也会修改。

原来,后者存在 异步 的概念。

让我们来想象这样一个数组,它不只是简单地获得值,它还是一个懒惰地接受和响应(也就是“反应”)值的数组,比如:

设置“懒惰的数组” a 的过程是异步的!

b ,是 map 映射后的数组,但更重要的是,b 是 反应性 的,我们对 b 加了一个类似监听器的东西。

这里直接给出解答:

这里再多小结一句:时间让异步更加复杂,函数式编程在异步下的运用就是减少或直接干掉时间状态。

想象下 a 还可以被绑定上一些其他的事件上,比如说用户的鼠标点击事件和键盘按键事件,服务端来的 websocket 消息等。

上述的 LazyArray 又可叫做 observable !(当然,它不止用在 map 方法中)

现在已经有各种各样的 Observables 的库类,最出名的是 RxJS 和 Most 。

以 RxJS 为例:

不仅如此,RxJS 还定义了超过 100 个可以在有新值添加时才触发的方法。就像数组一样。每个 Observable 的方法都会返回一个新的 Observable,意味着他们是链式的。如果一个方法被调用,则它的返回值应该由输入的 Observable 去返回,然后触发到输出的 Observable里,否则抛弃。

比如:

本篇介绍了【异步】在函数式编程中的表现。

原则是:对于那些异步中有时态的操作,基础的函数式编程原理就是将它们变为无时态的应用。即 减少时间状态 !

就像 promise 创建了一个单一的未来值,我们可以创建一个积极的列表的值来代替像惰性的observable(事件)流的值。

我们介绍了 RxJS 库,后续我们还会介绍更多优美的 JS 函数式编程库!

(俗话说的好,三方库选的好,下班都很早!!)

现在本瓜有点明白那句话了:看一门语言是不是函数式编程,取决于它的核心库是不是函数式编程。

也许我们还不熟悉像 RxJS 这类库,但我们慢慢就会越来越重视它们,越来越使用它们,越来越领会到它们!!

异步,以上。

js函数式编程思想就是运算不改变值只是新建值吗?

你好,你可以这样理解,函数式编程它不修改状态,因此函数式编程只是返回新的值,不修改系统变量。函数式编程思想是把运算过程尽量写成一系列嵌套的函数调用。

它主要是通过闭包和高阶函数等来进行编程,属于面向过程编程,强调通过函数,而不是语句来编程。

求科普什么是函数式编程语言

实际上,函数式编程没有一个严格的官方定义。严格上来讲,函数式编程中的“函数”,并不是指我们编程语言中的“函数”概念,而是指数学“函数”或者“表达式”(例如:y=f(x))。不过,在编程实现的时候,对于数学“函数”或“表达式”,我们一般习惯性地将它们设计成函数。所以,如果不深究的话,函数式编程中的“函数”也可以理解为编程语言中的“函数”。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。