在开始之前先看看方应杭对闭包的概念讲解
文章中指出: 「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。
- 记住 闭包是变量加函数形成的, 他虽然是作用域之间拉扯形成的, 但是必须是变量加函数
首先了解闭包先要了解作用域, 什么是作用域
我们看这个图, 学生总是被学校管理的, 每个圈是一个 作用域 === 作用域范围, 每个环境是有人需要他的前提下他才存在的, 当不需要的时候一定会被毁灭掉
然后我们看一下全局环境下变量的回收
注意, 不信你也写一个试一下, 点击后会回收吗, 当然不会, 无数次点击都会弹出, 并不会销毁
为啥没有销毁呢, 其实浏览器全局的变量, 因为我们在控制台会使用, 像window属性我们都会使用, 所以全局变量并不会回收, 只有浏览器关闭, 那么就是人为回收
但是钻的人有问题, 那现在是全局let, 那在全局let,这个东西声明到哪里呢
- 我在控制台举了几个例子
- 看到没根本不在window, 我们看看他在哪里
- 看到没有, 这里他的scope, 也就是作用域是在script内的, 其实他的范围是全局但是不包括window中
- 不知道scope是啥, 没事, 看完这个文章, 再看看这个文章你就完全懂了这都是啥了, 也就看懂闭包了
- 有人看到gobal是啥, script也就是当前的页面, 我写文章不留疑问, 直接一起说
- 那么script作用域怎么访问呢, 你想, 当前的代码块, 不就是直接调用吗
- global是啥
《JS高级程序设计》中谈到,global对象可以说是ECMAScript中对特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。从某种意义上讲,它是一个终极的“兜底儿对象”,换句话说呢,就是不属于任何其他对象的属性和方法,最终都是它的属性和方法。我理解为,这个global对象呢,就是整个JS的“老祖宗”,找不到归属的那些“子子孙孙”都可以到它这里来认祖归宗。所有在全局作用域中定义的属性和函数,都是global对象的属性和方法,比如isNaN()、parseInt()以及parseFloat()等,实际都是它的方法;还有就是常见的一些特殊值,如:NaN、undefined等都是它的属性,以及一些构造函数Object、Array等也都是它的方法。总之,记住一点:global对象就是“老祖宗”,所有找不到归属的就都是它的。
JavaScript中的global对象,window对象以及document对象
这里是我弄懂闭包的过程, 跟着文章, 看了方应杭的文章, 再看了链接 函数的闭包、作用域跟[[Scopes]]的关系 你就懂了
最后总结
- 那么闭包就是 「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。
- 给你看个东西
- 可以看出js他有闭包的特性, 子函数可以访问父函数的数据, 这就是闭包
- 在做项目经常看老师去缓存一个变量, 学到闭包发现这样解决了内存泄漏
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END