平平无奇的JavaScript函数【趣学前端】

举报
叶一一 发表于 2023/02/20 22:27:02 2023/02/20
【摘要】 背景最近睡前习惯翻会书,重温了《JavaScript权威指南》。这本书,文字小,内容多。两年了,我才翻到第十章。因为书太厚,平时都充当电脑支架。JavaScript函数读这章之前,我感觉我三十年开发功力,应该对它很熟悉了,哪行代码差不多都有它,它跟谁都熟悉。平平无奇万能「调和剂」,JavaScript的基层「员工」。函数是一个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); // => 49

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

函数记忆

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

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

总结

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

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

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


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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。