混淆了太多概念,我来尝试指一条明路吧
1. 理解 Js 中对象和属性访问器的概念,参考阅读
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Property_Accessors
此处重点是要理解 JS 中一切皆是对象,并且对象中的属性和方法可以被属性访问器访问到
2. 理解什么是闭包,参开阅读
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
此处需要重点理解词法作用域的概念,进而理解闭包的本质就是你持有的的某个可以被调用的函数会保持着自己作用域链(又称词法环境)的引用。
3. 理解 IIFE,参考阅读
https://developer.mozilla.org/zh-CN/docs/Glossary/立即执行函数表达式
4. 理解 var,参考阅读
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/var
此处重点其实是这句话,“用 var 声明的变量的作用域是它当前的执行上下文,它可以是嵌套的函数,或者对于声明在任何函数外的变量来说是全局。”
5. 在 1,2,3,4 的基础上就可以推导出,privateCounter 只是一个在匿名函数词法作用域中的一个变量,并且和对象没有任何关系
6. 你可能还会一知半解,延伸阅读推荐,you don’t know js,有中文版,开源地址为
https://github.com/getify/You-Dont-Know-JS/tree/2nd-ed/scope-closures
这一章对词法作用域,作用域链,全局作用域,对象生命周期,闭包有详实的讲解
7. 千万别和 this 问题混淆,那是另一个大坑