趣学前端 | 平平无奇的JavaScript函数

news2025/1/19 8:03:35

背景

最近睡前习惯翻会书,重温了《JavaScript权威指南》。这本书,文字小,内容多。两年了,我才翻到第十章。因为书太厚,平时都充当电脑支架。

JavaScript函数

读这章之前,我感觉我三十年开发功力,应该对它很熟悉了,哪行代码差不多都有它,它跟谁都熟悉。平平无奇万能「调和剂」,JavaScript的基层「员工」。

函数是一个JavaScript代码块,定义之后,可以被执行或调用任意多次。

读完整章,发现了一些有趣的知识点,写个笔记帮助日后翻阅查找。

递归函数与调用栈

总结一下最大调用栈溢出的问题

函数A、函数B、函数C依次调用,3个函数的执行上下文会被JavaScript解释器记录,可以把这些函数依次执行概括为一个调用栈。当一个函数调用另一个函数时,就会有一个执行上下文被推到调用栈。递归就更逆天了,如果函数递归调用自己100次,调用栈就会被推入100个对象,之后会被弹出。当时一次调用数量上万,就有可能导致“最大调用栈溢出”的问题。

来个递归试试效果,以求和方法为例

function sum(n) {
  if (n === 1) return 1;
  return sum(n - 1) + n;
}
let num = sum(10000);
console.log(num); // => Maximum call stack size exceeded

当我求1-10000之和时,提示我“最大调用栈溢出”。

这个知识点给我提了个醒,使用递归的时候要谨慎。

把函数实参解构为形参

这种方式可以提升代码的可读性。如果直接传入实参,不读函数中的代码或者加注释,不好理解这些参数怎么用。

function userInfo(u, o, g) {
  let price = o[1] + o[2];
  if (price === 0) {
    return `${u.userName}没有购买任何商品`;
  } else {
    return `${u.userName}购买了${g},一共花了${price}元。`;
  }
}
let res = userInfo({ userName: '张三' }, [99, 100], '帽子、鞋子');
console.log(res); // => 张三购买了帽子、鞋子,一共199元。

但是换成形参,代码就好理解多了,参数的用户名、商品价格、商品名称,一目了然。

function userInfo({ userName }, [price1, price2], goodName) {
  let price = price1 + price2;
  if (price === 0) {
    return `${userName}没有购买任何商品`;
  } else {
    return `${userName}购买了${goodName},一共${price}元。`;
  }
}
let res = userInfo({ userName: '张三' }, [99, 100], '帽子、鞋子');
console.log(res); // => 张三购买了帽子、鞋子,一共199元。

高阶函数

文章中对高阶函数的定义,简单直白。

高阶函数就是操作函数的函数,它接收一个或多个函数作为参数并返回一个新函数。

虽然定义看着简单又直接,不过使用起来有点绕,但是效果惊人。

function compose(f, g) {
  return function (...args) {
    return f.call(this, g.apply(this, args));
  };
}
let sum = (x, y) => x + y;
let square = x => x * x;
// 数字2和5 和的平方
let res = compose(square, sum)(2, 5);
console.log(res); // => 49

let diff = (x, y) => y - x;
// 数字2和5 差的平方
let res2 = compose(square, diff)(2, 5);
console.log(res2); // => 9

函数记忆

在函数式编程中,将上次计算结果进行缓存,如果再次计算时的参数相同,则直接返回缓存中的计算结果,这种缓存被称为函数记忆。

这个知识点,老实话,什么时机用得上,我还在摸索中,先记录一下。

总结

重温函数之后,总结了一些工作上可能用到的知识点,今天也特别有收获的一天。

我发现我总是在不同的时间段反复爱上JavaScript,偶尔翻出来珍藏的技术书,都能或多或少的有点收获。

这次的宝藏图书《JavaScript权威指南》,也是一样,原来觉得枯燥的章节,最近读起来也很丝滑,比巧克力还丝滑。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。

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

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

相关文章

构建社区服务平台的智慧架构

社区服务平台作为连接社区居民与各类服务资源的桥梁,承载着提升居民生活品质、促进社区发展的重要使命。本文将深入探讨社区服务平台的架构设计理念、核心功能和发展前景,助力读者了解如何构建智慧化、便捷化的社区服务平台,为社区居民提供更…

SpringBoot+Vue项目报错(问题已解决)

1、错误日志 2、分析原因: JWT strings must contain exactly 2 period characters. Found: 0 JWT字符串必须包含2个句号字符。发现:0 分析:可以判断出大概可能是token格式出现了问题 3、参考 http://t.csdnimg.cn/hfEiY 4、检查后端代码是否出现问…

VR数字展厅在企业中应用的优势有哪些?

随着VR全景技术的成熟,VR数字展厅逐渐成为了企业展示形象和产品的重要手段之一。VR企业数字展厅是一种通过VR技术、3D建模技术展示企业形象和产品的创新方式,将企业线下的展厅搬到线上,为企业品牌形象带来了很多优势。 VR数字展厅在企业中应用…

数学实验_Matlab使用2_简单绘图

简单使用 x -pi * 2 : .1 : pi*2;y sin(x);plot(x, y); % 绘制普通图像plot(x, y, k-.*); % 绘制2维图像,线为实线,*为每个点(Matlab的画图比较原始,就是简单的秒点画图)grid on; % 打开网状格式% grid off; % 关闭…

php中 0 == ‘’(0等于任意字符串) 判断是否成立 返回true

php中不同类型变量之间比较大小 一、背景二、探究0是为什么?三、探究 0all是为什么?四、程序中如何判断0是否等于指定字符串 一、背景 最近在项目实际开发中,我需要判断前端传来的参数值是否等于一个字符串;然后发现当参数值是0时…

每天五分钟计算机视觉:如何构造分类定位任务的算法模型?

本文重点 本节课程我们将学习分类定位的问题,也就是说不仅要完成图片分类任务,然后还要完成定位任务。如下所示,我们不仅要用算法判断图片中是不是一辆车,还要在图片中标记出它的位置,用边框对象圈起来,这就是分类定位问题。 一般可能会有一张图片对应多个对象,本节课我…

你《时间贫困》么?

今天我要为大家分享的书叫《时间贫困》 这本书出版于2023年12月 “时间贫困”这个名字是什么意思呢? 它指的是一种没有自己的时间的感受 这种感受我相信大家都不陌生 现代人早晨被闹钟叫醒后就忙着洗漱、吃早饭、上班 下班后经过漫长的通勤回到家 可能还要处理各种琐…

Mysql 死锁案例4-delete 相邻记录导致死锁

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10),(15,15,15) 事务1事…

数据结构入门篇 之 【双链表】的实现讲解(附完整实现代码及顺序表与线性表的优缺点对比)

一日读书一日功,一日不读十日空 书中自有颜如玉,书中自有黄金屋 一、双链表 1、双链表的结构 2、双链表的实现 1)、双向链表中节点的结构定义 2)、初始化函数 LTInit 3)、尾插函数 LTPushBack 4)、头…

04_拖动文件渲染在页面中

新建一个文件夹,跟之前一样,在 Vscode 终端里输入 yarn create electron-app Drag。 在 index.html 添加以下代码,JS 文件夹和 render.js 都是新创建的: 首先,css 文件一般和 html 结合使用,相当于 html 是…

SQL-Labs靶场“32-33”关通关教程

君衍. 一、32关 GET单引号闭合宽字节注入1、源码分析2、宽字节注入原理3、联合查询注入4、updatexml报错注入5、floor报错注入 二、33关 GET单引号addslashes逃逸注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 一、32关 GET单引号闭合宽字节注入 请求方…

yolov5-模型蒸馏算法

一般来说模型剪枝之后精度都会下降,微调之后会恢复一部分,但仍然达不到剪枝前的精度,因此蒸馏会在微调阶段配合使用 蒸馏是一种基于“教师-学生网络”的训练方法,教师模型参数量较大,效果更好,学生模型参数量较少,效果较差,蒸馏即让小模型学习大模型的知识,提升小模型…

ADO .Net操作SQL Server数据库

//ADO.NET是.NET Framework提供的数据访问服务的类库,应用程序可以使用ADO.NET连接到这些数据源,并检索、处理和更新数据 //常用的数据源包括四种:(1)Microsoft SQL Server数据源:使用System.Data.SqlClien…

力扣27. 移除元素

思路:数组的空间是连续的,没办法删除,所以只能是覆盖; 把有用的元素排上来之后,剩下的空间放什么元素可以直接忽视,然 后我们只需要返回新数组中长度即可; 快慢指针法:我们需要新建两…

数据仓库的基本概念、基本特征、体系结构

个人看书学习心得及日常复习思考记录,个人随笔。 数据仓库的基本概念、基本特征 数据仓库的定义:数据仓库是一个面向主题的、集成的、不可更新的、随时间不断变化的数据集合,用以更好地支持企业或组织的决策分析处理。 数据仓库中数据的4个…

[LeetCode][LCR169]招式拆解 II——巧妙利用字母的固定顺序实现查找复杂度为O(1)的哈希表

题目 LCR 169. 招式拆解 II 某套连招动作记作仅由小写字母组成的序列 arr,其中 arr[i] 第 i 个招式的名字。请返回第一个只出现一次的招式名称,如不存在请返回空格。 示例 1: 输入:arr "abbccdeff" 输出:a…

基于SSM的协同过滤算法的电影推荐系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的协同过滤算法的电影推荐系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通…

LDA主题模型学习笔记

(1)LDA的基本介绍(wiki) LDA是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题…

软考高级:信息系统开发方法2(形式化方法、统计过程方法等)概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

前端学习笔记 | WebAPIs(DOM+BOM)

一、作用和分类 1、基本概念 作用:使用JS去操作HTML和浏览器 分类:DOM(文档对象模型)和BOM(浏览器对象模型) html的标签JS的DOM对象 2、获取DOM对象-参数必须加引号 (1)选择匹配的第…