前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >趣学前端 | 平平无奇的JavaScript函数

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

作者头像
叶一一
发布2025-01-18 14:01:05
发布2025-01-18 14:01:05
3900
代码可运行
举报
文章被收录于专栏:趣学前端趣学前端
运行总次数:0
代码可运行

背景

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

JavaScript函数

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

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

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

递归函数与调用栈

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

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

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

代码语言:javascript
代码运行次数:0
复制
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之和时,提示我“最大调用栈溢出”。

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

把函数实参解构为形参

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

代码语言:javascript
代码运行次数:0
复制
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元。

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

代码语言:javascript
代码运行次数:0
复制
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元。

高阶函数

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

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

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

代码语言:javascript
代码运行次数:0
复制
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权威指南》,也是一样,原来觉得枯燥的章节,最近读起来也很丝滑,比巧克力还丝滑。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • JavaScript函数
    • 递归函数与调用栈
    • 把函数实参解构为形参
    • 高阶函数
    • 函数记忆
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档