知识卡片
闭包实现真正无法绕过的私有状态
内容
要给一个计数器函数保存跨调用的状态,一种做法是把计数器挂在函数自身的属性上(如uniqueInteger.counter),但这个属性和对象的普通属性一样是外部可读写的,任何代码都能把计数器重置或篡改成非法值,起不到真正的封装效果。闭包提供的是另一个量级的私有性:把状态声明为外部函数的局部变量,只把读写这个变量的内部函数暴露出去,外部世界压根没有任何路径能直接触碰到这个变量——它不是对象的属性,不出现在任何可枚举的属性列表里,没有名字可以通过点或方括号访问到。这种私有性不是约定俗成的”不要访问xxx”式的君子协议,而是语言机制层面彻底切断了访问路径,是JavaScript在没有private关键字的年代实现真封装的核心手段。
参考来源
《JavaScript权威指南(原书第6版)》第8章《函数》