文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JS中factorial函数进化的三个步骤

2024-04-02 19:55

关注

本篇内容主要讲解“JS中factorial函数进化的三个步骤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS中factorial函数进化的三个步骤”吧!

一、首先写一段求阶乘的函数

用 memozation实现一段factorial

> var cache = {}; > > function factorial(x) { ...     if (x < 2) return 1; ...     if (!(x in cache)) { .....         cache[x] = x * factorial(x - 1); .....     } ...     return cache[x]; ... } > factorial(8) 40320 > cache { '2': 2, '3': 6, '4': 24, '5': 120, '6': 720, '7': 5040, '8': 40320 }

此处 cache 只用于函数 factorial 之内,却过分暴露于外。按照 least exposure(POLE)  将其隐藏起来。直觉方法就是直接将其放入其中。

二、初步解决接口过分暴露的问题

重新定义最外层coverTheCache函数将其包裹起来。

> function coverTheCache() { ...     // "middle scope", where we cover `cache` ...     var cache = {}; ... ...     return factorial; ... ...     // ********************** ... ...     function factorial(x) { ...         // inner scope ...         if (x < 2) return 1; ...         if (!(x in cache)) { .....             cache[x] = x * factorial(x - 1); .....         } ...         return cache[x]; ...     } ... }

运行测试:

> let factorial2 = coverTheCache(); > factorial2(9) 362880 > factorial(10) 3628800

此解决方案完全符合直觉,就是单单的将步骤一中的factorial函数与变量cache收纳到另外一个函数coverTheCache的肚子里,包裹了一层环境。

缺憾之处在于,`let factorial2 =  hideTheCache();`此处还要另行调用。因此,接下来将重新declare与赋值的这一步去掉。

三、IIFE解决过分暴露的问题

> const factorial3 = (function coverTheCache() { ...     var cache = {}; ... ...     function factorial(x) { ...         if (x < 2) return 1; ...         if (!(x in cache)) { .....             cache[x] = x * factorial(x - 1); .....         } ...         return cache[x]; ...     } ... ...     return factorial; ... })(); // 关键步骤 undefined > factorial3(11) 39916800 > factorial(300) Infinity > factorial(30) 2.6525285981219103e+32

如此就不必再另行一步调用,该方法称之为 IIFE(

Immediately-Invoked-Function-Expression):

// outer scope (function(){     // inner hidden scope })(); // more outer scope

四、总结

我们以memorization的方式求factorial而遭遇over-exposure的问题,由此引出

priciple-of-lease-exposure的原则。

作为解决方案,直觉的做法是将其包裹在外层函数之内,不足之处在于需要重新declare函数。进一步解决问题,省略掉重新declare与assignment,用IIFE,在定义的同时也实现定义。

以上就是factorial这个函数进化的三个步骤。

到此,相信大家对“JS中factorial函数进化的三个步骤”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯