花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 37|回复: 10

JS极简闭包计数器

[复制链接]
  • TA的每日心情
    慵懒
    2025-11-22 10:11
  • 签到天数: 1647 天

    [LV.Master]伴坛终老

    3015

    主题

    12万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2025-11-22 12:32 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    函数就一行代码:

    const counter = (startNum) => () => ++startNum;

    这是箭头函数的好处,简洁。但是,函数看着抽象,分行写看看:

    const counter = (startNum) => { return () => ++startNum; };

    还有点抽象?箭头函数的问题。用传统函数改写一下:

    function counter(startNum) { return function() { return ++startNum; } }

    如果确实不习惯箭头函数,现在也应该可以看出点道道来了:这是一个函数里还有函数的函数。外层函数是具名函数,counter,计数器,它需要一个参数,startNum,起始计数值;里层函数被外层函数嵌套,是个匿名函数,它将外层函数的参数 startNum 加 1 并返回结果,然后以函数形式返回给外层函数。

    外层函数称父函数,里层的函数称子函数。子函数通常就是一个闭包,它能获取父层函数的参数或变量并对之操作,然后,或者返回操作结果,或者返回函数。本例返回的是函数,所以,这样调用:

    <style> .counterWrap { padding: 40px; } #txtRes, #btnAdd { margin: 0; padding: 8px; } </style> <div class="counterWrap" style=""> <input type="text" id="txtRes" value="0" /> <button type="button" id="btnAdd">点击计数</button> </div> <script> // 闭包计数器 const counter = (startNum) => () => ++startNum; // 引用函数 const calc = counter(0); // 输出结果 btnAdd.onclick = () => txtRes.value = calc(); </script>

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

  • TA的每日心情
    慵懒
    2025-11-22 10:11
  • 签到天数: 1647 天

    [LV.Master]伴坛终老

    3015

    主题

    12万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-11-22 12:38 | 显示全部楼层
    counter 函数返回的是函数,不能直接得到结果,所以创建一个引用 counter 函数 的函数 calc:

    const  calc = counter(0);

    这个 calc() 函数才是直接拿到结果的函数。可以根据需要创建初始值不同的计数器,例如从10开始:

    const calc10 = counter(10);

    首次calc10() 运行的结果是 11 ,而后以 1 为单位继续累加
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-22 10:11
  • 签到天数: 1647 天

    [LV.Master]伴坛终老

    3015

    主题

    12万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-11-22 12:43 | 显示全部楼层
    闭包计数器函数属于纯函数,它不改变外部变量,只根据参数进行运算,同时将运算结果储存在闭包里面,外部只能使用它而无法改变它
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-11-17 10:56
  • 签到天数: 1050 天

    [LV.10]以坛为家III

    1879

    主题

    32万

    回帖

    36万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-11-22 15:37 | 显示全部楼层
    这个是从0开始的,每点击一下,就累积一次呢
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-11-17 10:56
  • 签到天数: 1050 天

    [LV.10]以坛为家III

    1879

    主题

    32万

    回帖

    36万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-11-22 15:39 | 显示全部楼层
    这个步距永远是1吧,不能以2为单位进行累加吧
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-22 10:11
  • 签到天数: 1647 天

    [LV.Master]伴坛终老

    3015

    主题

    12万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-11-22 17:40 | 显示全部楼层
    红影 发表于 2025-11-22 15:39
    这个步距永远是1吧,不能以2为单位进行累加吧

    ++变量

    等于

    1+变量

    1 是累加数

    如果需要不同的累加数,需要修改 counter 函数
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-22 10:11
  • 签到天数: 1647 天

    [LV.Master]伴坛终老

    3015

    主题

    12万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-11-22 17:41 | 显示全部楼层
    红影 发表于 2025-11-22 15:37
    这个是从0开始的,每点击一下,就累积一次呢

    对,后续创建的 calc 函数以 counter(0) 调用计数器函数,0 是计数器的起始值
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-11-17 10:56
  • 签到天数: 1050 天

    [LV.10]以坛为家III

    1879

    主题

    32万

    回帖

    36万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-11-22 20:35 | 显示全部楼层

    大多数都采用1作为累加数的吧。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-11-17 10:56
  • 签到天数: 1050 天

    [LV.10]以坛为家III

    1879

    主题

    32万

    回帖

    36万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-11-22 20:36 | 显示全部楼层
    马黑黑 发表于 2025-11-22 17:41
    对,后续创建的 calc 函数以 counter(0) 调用计数器函数,0 是计数器的起始值

    我在那个演示里给了它一个数,结果它还是一点点加起来的,如果需要改变从0开始,是代码里改变的呢。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-22 10:11
  • 签到天数: 1647 天

    [LV.Master]伴坛终老

    3015

    主题

    12万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-11-22 22:18 | 显示全部楼层
    红影 发表于 2025-11-22 20:36
    我在那个演示里给了它一个数,结果它还是一点点加起来的,如果需要改变从0开始,是代码里改变的呢。

    counter 是一个函数工厂,它可以创建:

    counter calc_from(0) = counter(0); // 从0开始计数
    const calc_from(5) = counter(5); // 从5开始计数

    运行上述两个函数,每一次都是加1,第一个第一次函数运行得到1,然后就是2、3、4、5……;第二个函数第一次运行的6,然后就是7、8、9、10……

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-11-22 10:11
  • 签到天数: 1647 天

    [LV.Master]伴坛终老

    3015

    主题

    12万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-11-22 22:19 | 显示全部楼层
    红影 发表于 2025-11-22 20:35
    大多数都采用1作为累加数的吧。

    这个看需要,不同的需要做不同的函数设计
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-11-23 11:18 , Processed in 0.072588 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表