MDN的IIFE私有变量示例改写为普通函数效果一致,核心展示什么?
你对闭包和函数作用域的理解完全没问题,MDN这个示例里的IIFE确实是冗余的,你改写后的普通函数版本和原版逻辑100%等价。
为什么两者效果完全一致
函数的参数本身就属于当前函数作用域内的私有变量,原版代码里IIFE做的唯一一件事就是额外套了一层作用域:把外层makeWithdraw接收的balance参数复制给内层IIFE的copyBalance,再在内层重新声明一个balance变量赋值。这层嵌套没有任何额外作用,完全可以直接用外层makeWithdraw的函数作用域替代,也就是你改写的版本。
MDN写这个示例的目的
这个示例本质是想演示「通过函数作用域实现私有变量」的特性:
- 内部的
balance变量和doBadThings方法不会暴露到返回的对象上,外部无法直接访问,只能通过暴露的withdraw方法操作,这就是闭包实现的封装效果。 - 用IIFE写只是演示的一种方式,大概率是这个章节的上下文刚讲完IIFE的作用域隔离特性,所以先用IIFE做示例,方便刚接触的读者理解「独立作用域」的概念,并不是说这种场景下必须用IIFE。
补充说明
你改写的版本实际上比原版更简洁高效,去掉了无意义的作用域嵌套,实现的效果完全相同。如果是实际开发中碰到这类场景,直接用你改写的写法就可以。
内容的提问来源于stack exchange,提问作者trier
相关产品推荐
相关产品推荐

