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

背景

最近睡前习惯翻会书,重温了《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); // => 49let diff = (x, y) => y - x;
// 数字2和5 差的平方
let res2 = compose(square, diff)(2, 5);
console.log(res2); // => 9

函数记忆

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

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

总结

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

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

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


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

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

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

相关文章

经典卷积神经网络LeNet-5、AlexNet、VGG-16

一、LeNet-5 这里只讲一下C5,卷积核大小是5*5,通道数是120,所以卷积完成之后是1*1*120,这里形成120个卷积结果。每个都与上一层的16个图相连。所以共有(5x5x161)x120 48120个参数,同样有48120个连接。 其他卷积层和池…

Maven: There are test failures.(已解决)

问题解决办法 进行package打包时报错如下: 然后这些并不能看出是测试的哪里的问题,可以点击上一级进行查看更详细的错误,越向上日志越详细,可以看到是52行出了错误, 52对应代码如下: 原因是存在注册的测…

HTML5+CSS3+JS小实例:全屏范围滑块

实例:全屏范围滑块 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…

R语言系列4——R语言统计分析基础

目录 写在开头1. 描述性统计分析1.1 描述性统计分析的定义与重要性1.2 R语言中的描述性统计分析功能1.3 常用的描述性统计量及其在R中的计算方法1.4 使用R语言进行描述性统计分析的实际示例1.5 描述性统计分析的局限性和应用注意事项 2. 假设检验基础2.1. 假设检验的基本原理和…

机试:偶数分解

题目描述: 代码示例: #include <bits/stdc.h> using namespace std; int main(){ // 算法思想1:遍历小于该偶数的所有素数,存入数组中,遍历数组找出两个数之和等于偶数的数int n;cout << "输入样例" << endl;cin >> n;int nums[n];int k …

LeetCode98题:验证二叉搜索树(python3)

代码思路&#xff1a; 二叉搜索树的具体定义&#xff1a; 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 也可以理解为&#xff1a; 当前节点的值是其左子树的值的上界&#xff08;最大值&#xff09; 当前节点的值是其右子树的值的下界&#xf…

计算机网络-第7章 网络安全(1)

主要内容&#xff1a;安全威胁与问题、对称密钥密码体制和公钥密码体制、数字签名与鉴别、网络层和运输层安全协议、应用层电子邮件、系统安全&#xff1a;防火墙与入侵检测 当网络中的用户都来自社会各个阶层和部门时&#xff0c;网络中存储和传输的数据需要保护。 7.1 网络安…

Vue2(五):收集表单数据、过滤器、内置指令和自定义指令

一、回顾 总结Vue监视数据 1.Vue监视数据的原理&#xff1a; 1.vue会监视data中所有层次的数据。 2.如何监测对象中的数据?通过setter实现监视&#xff0c;且要在new Vue时就传入要监测的数据。(1&#xff09;.对象中后追加的属性&#xff0c;Vue默认不做响应式处理(2&#…

【Attribute】Inspector视图可视不可编辑字段特性

简介 在Unity开发中&#xff0c;有时候我们存在这种需求&#xff0c;需要在Inspector视图中可以查看字段信息但是无法对字段进行赋值&#xff0c;那么我们也可以像Unity内置的[SerializeField]、[Tooltip]等特性那样自定义一个特性&#xff0c;用于满足这个需求。 代码示例(C#…

【OpenGL手册13】 光照贴图

目录 一、说明二、漫反射贴图三、镜面光贴图四、采样镜面光贴图练习 一、说明 在上一节中&#xff0c;我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xff0c;但是这仍不能对一个…

【Sql】MVCC有关问题,以及锁,日志和主从复制原理

目录 MVCC 解决什么问题? 实现原理 隐式字段 undo log Read View(读视图) InnoDB 对 MVCC 的实现 锁 分类 锁升级&#xff1f; InnoDB 的行锁&#xff1f; 死锁避免&#xff1f; 乐观锁和悲观锁 日志 主从复制原理 主从复制的作用 MySQL主从复制解决的问题 涉…

2023年中国抗DDoS市场规模现状及竞争格局,公有云抗DDoS是主要增长点

分布式拒绝服务&#xff08;DDoS&#xff09;是在DoS基础之上产生的一种新的攻击方式&#xff0c;具有多对一的攻击模式。它通过制造伪造的流量&#xff0c;使得被攻击的服务器、网络链路或是网络设备&#xff08;如防火墙、路由器等&#xff09;负载过高&#xff0c;无法处理正…

[算法] 牛课题霸 - DP6 连续子数组最大和 - 动态规划

文章目录 题目链接解题过程思路一思路二 题目链接 DP6 连续子数组最大和 解题过程 思路一 两个for循环&#xff0c;遍历。 因为每个元素都要遍历两遍&#xff0c;所以时间复杂度O(n^2)。 简单的测试用例可以通过&#xff0c;但是提交时&#xff0c;一个巨大的数组用例&…

el-table 的选择框如何根据条件设置某项不可选中

效果如图&#xff1a;实现某条数据不可选&#xff0c;其他数据可选 核心代码&#xff1a; <el-table-column type"selection" width"55" :selectable"selectable"></el-table-column> 在选择框的列上加上 :selectable"select…

Github 2024-03-13 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目2Python项目2非开发语言项目2HTML项目1CSS项目1Dart项目1TypeScript项目1Go项目1JavaScript项目1《Hello 算法》:动画图解、一键运行的…

2023 收入最高的十大编程语言

本期共享的是 —— 地球上目前已知超过 200 种可用的编程语言&#xff0c;了解哪些语言在 2023 为开发者提供更高的薪水至关重要。 过去一年里&#xff0c;我分析了来自地球各地超过 1000 万个开发职位空缺&#xff0c;辅助我们了解市场&#xff0c;以及人气最高和收入最高的语…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextClock)

TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间显示&#xff0c;最高精度到秒级。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextClock(options?…

一周学会Django5 Python Web开发-Jinja3模版引擎-安装与配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计35条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

vscode 之 vue项目如何使用ctrl+鼠标左键跳转对应文件

话不多说&#xff0c;直接步入正题 使用项目工程的jsconfig.json 直接在项目中使用jsconfig.json/tsconfig.json文件配置&#xff08;项目中没有相应的文件的添加文件&#xff0c;有文件的添加"paths": {"/*": ["./src/*"]}配置即可&#xff0…

STM32第八节:位带操作——GPIO输出和输入

前言 我们讲了GPIO的输出&#xff0c;虽然我们使用的是固件库编程&#xff0c;但是最底层的操作是什么呢&#xff1f;对&#xff0c;我们学习过51单片机的同学肯定学习过 sbit 修改某一位的高低电平&#xff0c;从而实现对于硬件的控制。那么我们现在在STM32中有没有相似的操作…