JavaScript编程基础 – 函数进阶

JavaScript编程基础 – 函数进阶

JavaScript Programming Essentials – Perfect Functions

“函数的第一条原则是要小,函数的第二条原则是要更小。“ – 罗伯特.C.马丁

前文讲述过函数多取决于数学的函数概念,以此来定义JavaScript编程语言的函数,从而实现函数式编程。

依据传统数学函数的定义,变量x和函数值y的相互关系始终遵循以下这个公式:
y = f(x)

至于输入的x如何变成y,却有诸多种方法。

尽管前文从不同角度介绍了函数,但是那些是传统的JavaScript函数思想,也就是说,随着ECMAScript标准的演进,这些东西都有可能产生变化。

本文简要介绍JavaScript函数在ECMAScript 2015,也就是ES6规范下的新的变化和新的功能,以便使读者了解函数式编程取得的新的进展能够更加有效地服务于软件服务。

1. 调用名称的函数

简而言之,函数是一段通过其名称被调用的代码,并且,它可以传递参数和返回值。
假设有一个简单函数,只返回它的参数传递的值,不进行任何复杂计算。

示例代码如下:

var simple = (a) => {return a}     // 一个最简单的函数
console.log(simple(5))           // 用函数的名称调用

运行结果如下图:
在这里插入图片描述

2. 调用方法的函数

作为一个简单的方法,用名称和其关联调用,是另一个函数示例,代码如下:

var obj = {simple : (a) => {return a }}
obj.simple(5)       // 用其名称及其关联对象调用

运行结果如下图:
在这里插入图片描述

3. 引用透明性

基于纯粹的函数定义,所有的函数对于相同的输入,都将返回相同的值。函数的这个属性被称为 引用透明性 (Reference Transparency)

以下定义几个简单函数,分别按照传原值、传加法值、传乘法值返回结果;无论传入什么作为输入,最终都会按规则把它返回。

var identity = (i) => {return i}
const add = (x, y) => x + y
const multiply = (x) => x * 5

执行结果如下图:

在这里插入图片描述
不难看出,JavaScript的表达式可以替换为它的计算值,这就是引用透明性

由于函数会为给定的输入,返回相同的值,实际上可以缓存它。

比如,有一个阶乘函数factorial,用来计算给定数值的阶乘,大家都知道5的阶乘等于120(54321 = 120),那么用户第二次调用函数factorial,结果如何呢? 答案仍然是120, 如下代码:

function factorial(n) {let ans = 1;if(n === 0)return 1;for (let i = 2; i <= n; i++)ans = ans * i;return ans;
}

执行结果如下图所示:
在这里插入图片描述

4. 命令式方法

创建一个数组,用for循环遍历它的数组元素,代码执行如下:
在这里插入图片描述

以上这段代码运行良好。但为了解决问题,需要准确地告知程序应该“怎么“做。在本中,代码告诉编译器获得数组长度,遍历数组,用索引获取每一个数组元素等。

这种方法称之为 “命令式“解决方案。命令式编程主张告诉编译器”怎么“做。

5. 声明式方法

另一种编程思路,是告诉编译器做“什么“, 而不是”怎么“做或者”如何“做。
这种方法称之为 “声明式“解决方案。声明式编程中,”怎么“做的部分被抽象到函数中。

示例代码如下,用内置的forEach函数遍历数组并打印输出它:

var array = [1, 2, 3]
array.forEach((element) => console.log(element))

执行结果如下图所示:
在这里插入图片描述
用函数方法处理循环问题
如果需要遍历一个数组,并且将结果打印输出到控制台,可用以下代码来实现:

var array = [1, 3, 5, 7, 9]
for (i = 0; i < array.length; i ++)
console.log(array[i])

执行结果如下图:
在这里插入图片描述

函数式编程中,将操作抽象成函数;如果这样做的话,需要把操作抽象为函数,以便在需要的时候能够重用,这比每次都告诉函数“怎样“去遍历要好。

6. 存储函数到变量

函数就是数据;可以把它存入一个变量。类似以下的代码:

let fn = () => {}
console.log(typeof fn)

执行结果如下图所示:
在这里插入图片描述

其功能无论如何增强,都验证了一个事实,就是函数的结果除了像返回值那样,还可以存储到(赋值)一个变量。

7. 传递函数

下面的函数示例,告诉我们接受一个参数并将参数的类型打印输出到控制台:

var tellType = (arg) => {console.log(typeof arg)
}
tellType("Welcome")

传递字符串“Welcome”作为参数,执行结果如下图:

在这里插入图片描述
可以看到,返回类型为string,如果增加传递几种参数,传递结果如下图:

在这里插入图片描述
返回类型分别为boolean, number和string.

另一个代码如下,将判断如果参数是函数,那么该函数tellType就执行它。

var tellType = (arg) => {if(typeof arg === "function") {arg()} else {console.log("The passed data is:" + arg)}    
}
var dataFn = "Welcome"
tellType(dataFn)

可以看到,通过传递dataFn(一个字符串变量)来执行tellType; 这样,成功地将dataFun传递给另一个函数tellType, 而tellType执行了传入的函数。

执行结果如下图所示:

在这里插入图片描述
函数式编程是JavaScript语言的显著特征,今后有机会将继续研究它的高级特性。

技术好文陆续推出,敬请关注。

喜欢就点赞哈。😊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++类与对象(3)—拷贝构造函数运算符重载

目录 一、拷贝构造函数 1、定义 2、特征 3、内置与自定义类型 4、const修饰参数 5、默认生成 浅拷贝 深拷贝 6、总结 二、运算符重载 1、定义 2、判断是否相等 3、比较大小 4、赋值 5、总结 一、拷贝构造函数 1、定义 拷贝构造函数&#xff1a;只有单个形参…

EL-input添加双击或者单击事件

#El-lement UI # 这个框架确实给我们带来了很多好处&#xff0c;最近一直忙于项目&#xff0c;没时间来写文章&#xff0c;最近有个问题困扰我很久&#xff0c;最终却很简单的解决了&#xff0c;记下来希望能帮助更多的人。 大家都知道el-input是无法直接添加click或者dblcli…

day61

今日内容概要 前后端数据传输的编码格式 Ajax提交json格式的数据 Ajax提交文件数据 Ajax实现弹窗的二次确认 批量增加数据 分页的原理及推导 分页类的使用 cookie和session的介绍 Django操作cookie、session 前后端数据传输的编码格式 我们只研究post请求方式的编码格…

axios的封装之axios是基于什么封装的?

axios的封装_axios是基于什么封装的 axios是基于JavaScript的XMLHttpRequest 和 Promise 对象进行封装的使用axios发送GET请求的示例axios 拦截器 axios的封装_axios是基于什么封装的 axios是基于JavaScript的XMLHttpRequest 和 Promise 对象进行封装的 在浏览器中&#xff…

利用 React 和 Bootstrap 进行强大的前端开发

文章目录 介绍React 和 Bootstrap设置环境使用 Bootstrap 创建 React 组件React-Bootstrap 组件结论 介绍 创建响应式、交互式和外观引人入胜的 Web 界面是现代前端开发人员的基本技能。幸运的是&#xff0c;借助 React 和 Bootstrap 等工具的出现&#xff0c;制作这些 UI 变得…

Tomcat 基线安全加固操作

目录 账号管理、认证授权 日志配置 通信协议 设备其他安全要求 账号管理、认证授权 ELK-tomcat-01-01-01 编号 ELK-Tomcat-01-01-01 名称 为不同的管理员分配不同的账号 实施目的 应按照用户分配账号&#xff0c;避免不同用户间共享账号,提高安全性。 问题影响 …

conda创建pytorch环境报错

昨天训练数据的时候&#xff0c;发现Anaconda占用C盘达到了20G&#xff08;暑假在cmd状态下安装的&#xff0c;默认下载到了C盘&#xff09;&#xff0c;心道再创建几个环境&#xff0c;C盘就要爆红了&#xff0c;于是重装Anaconda到了D盘&#xff0c;不过之后的初始化并不顺利…

Jtti:windows中apache怎么实现负载均衡

Jtti&#xff1a;windows中apache怎么实现负载均衡 在Windows环境下&#xff0c;你可以使用Apache HTTP Server搭建负载均衡集群。Apache提供了一个模块叫做mod_proxy&#xff0c;它可以用来实现反向代理和负载均衡。以下是一个简单的步骤来配置Apache负载均衡&#xff1a; 步骤…

Codesys数据类型(2.7):扩展数据类型之 别名 详解

Codesys代码代写&#xff0c;程序开发&#xff0c;软件定制&#xff0c;bug修改&#xff0c;问题咨询&#xff1a; T宝搜索店铺【林磊教育】 定义及声明 别名的目的是声明出 基本数据类型&#xff0c;结构体&#xff0c;枚举、共用体(UNION)、功能块、指针备用名字&#xff0c…

django及DRF流程源码分析

Django执行流程: 1.nginx作为接入层,通过反向代理&#xff0c;监听80端口获取请求连接 2.将请求交给wsgi server 3.wsgi server调用django的wsgi.py 处理请求 4.WSGIHandler的__call__函数就是整个逻辑处理流程 5.WSGIHandler __init__中的加载中间件&#xff0c;对request对象…

【ARM AMBA AXI 入门 16 - AXI 写响应通道 BVALID | BREADY | BRESP 详细介绍】

请阅读【ARM AMBA AXI 总线 文章专栏导读】 文章目录 AXI 写响应通道BVALIDBREADYBRESP举例BRESP[2:0] 编码AXI 写响应通道 在 ARM AMBA AXI 协议中,写响应通道包括以下三个信号,用来完成写事务的确认和状态传递: BVALID 这是一个从设备(Slave)发出的信号,表明与当前…

生态系统NPP及碳源、碳汇模拟实践技术应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放&#xff08;碳源&#xff09;和碳固定&#xff08;碳汇&#xff09;这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…

【HarmonyOS】低代码平台组件拖拽使用技巧之常用基础组件(上)

【关键字】 HarmonyOS、低代码平台、组件拖拽、常用基础组件、基础容器 1、写在前面 之前是花了一些时间介绍了在低代码平台中滚动容器、网格布局、页签容器、列表这几种容器的拖拽技巧及使用方法&#xff0c;今天我会继续来介绍咱们在应用开发中可能会经常用到的一些基础容器…

Flutter dio Http请求之Cookie管理

在应用开发过程中&#xff0c;我们进行Http通讯时会使用Cookie进行验证&#xff0c;今天我们就着重讲解Flutter 网络请求插件dio的cookie使用。 首先&#xff0c;我们要进行插件引用 # HTTP 请求 dio: ^5.1.1 cookie_jar: ^4.0.8 dio_cookie_manager: ^3.0.0# 获取沙盒路径 p…

CSS 属性计算过程

CSS 属性计算过程 首先&#xff0c;不知道你有没有考虑过这样的一个问题&#xff0c;假设在 HTML 中有这么一段代码&#xff1a; <body><h1>这是一个h1标题</h1> </body>上面的代码也非常简单&#xff0c;就是在 body 中有一个 h1 标题而已&#xff…

CSDN每日一练 |『多边形的面积』『硬币的面值』『开学趣闻之美食诱惑』2023-11-21

CSDN每日一练 |『多边形的面积』『硬币的面值』『开学趣闻之美食诱惑』2023-11-21 一、题目名称:多边形的面积二、题目名称:硬币的面值三、题目名称:开学趣闻之美食诱惑一、题目名称:多边形的面积 时间限制:1000ms内存限制:256M 题目描述: 给出一个简单多边形(没有缺口)…

Docker快速安装Mariadb11.1

MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。在存储引擎方面&#xff0c;使用XtraDB来代替MySQL的InnoDB。 Mari…

AIX 系统基线安全加固操作

目录 账号管理 ELK-AIX-01-01-01 口令 ELK-AIX-01-02-01 授权 ELK-AIX-01-03-01 通信协议 IP协议安全 ELK-AIX-03-01-01 ELK-AIX-03-02-01 路由协议安全 补丁管理 ELK-AIX-04-01-01 服务进程和启动 ELK-AIX-05-01-01 设备其他安全要求 登陆超时策略 ELK-AIX-06-01-01 …

Clickhouse初认识

技术主题-clickhouse 一什么是clickHouse 1&#xff09;本质上就是一款数据库管理系统&#xff0c;能提供海量数据的存储和检索 2&#xff09;基于列存储&#xff0c;数据是按照列进行存储的&#xff08;数据格式一样&#xff0c;方便进行压缩&#xff09; 3&#xff09;具备…

基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管

一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构&#xff0c;该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标&#xff0c;Tiva™C系列架构提供了一个具有FPU的80…