闭包(看完这些 – 我好像是懂了)

在开始之前先看看方应杭对闭包的概念讲解

闭包 — 方应杭

文章中指出: 「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。
  • 记住 闭包是变量函数形成的, 他虽然是作用域之间拉扯形成的, 但是必须是变量加函数

首先了解闭包先要了解作用域, 什么是作用域

image.png

我们看这个图, 学生总是被学校管理的, 每个圈是一个 作用域 === 作用域范围, 每个环境是有人需要他的前提下他才存在的, 当不需要的时候一定会被毁灭掉

然后我们看一下全局环境下变量的回收

image.png

注意, 不信你也写一个试一下, 点击后会回收吗, 当然不会, 无数次点击都会弹出, 并不会销毁

为啥没有销毁呢, 其实浏览器全局的变量, 因为我们在控制台会使用, 像window属性我们都会使用, 所以全局变量并不会回收, 只有浏览器关闭, 那么就是人为回收

但是钻的人有问题, 那现在是全局let, 那在全局let,这个东西声明到哪里呢

  1. 我在控制台举了几个例子

image.png

  1. 看到没根本不在window, 我们看看他在哪里

image.png

  1. 看到没有, 这里他的scope, 也就是作用域是在script内的, 其实他的范围是全局但是不包括window中
  • 不知道scope是啥, 没事, 看完这个文章, 再看看这个文章你就完全懂了这都是啥了, 也就看懂闭包了

函数的闭包、作用域跟[[Scopes]]的关系

  1. 有人看到gobal是啥, script也就是当前的页面, 我写文章不留疑问, 直接一起说
  • 那么script作用域怎么访问呢, 你想, 当前的代码块, 不就是直接调用吗

image.png

  • global是啥

《JS高级程序设计》中谈到,global对象可以说是ECMAScript中对特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。从某种意义上讲,它是一个终极的“兜底儿对象”,换句话说呢,就是不属于任何其他对象的属性和方法,最终都是它的属性和方法。我理解为,这个global对象呢,就是整个JS的“老祖宗”,找不到归属的那些“子子孙孙”都可以到它这里来认祖归宗。所有在全局作用域中定义的属性和函数,都是global对象的属性和方法,比如isNaN()、parseInt()以及parseFloat()等,实际都是它的方法;还有就是常见的一些特殊值,如:NaN、undefined等都是它的属性,以及一些构造函数Object、Array等也都是它的方法。总之,记住一点:global对象就是“老祖宗”,所有找不到归属的就都是它的。

JavaScript中的global对象,window对象以及document对象

这里是我弄懂闭包的过程, 跟着文章, 看了方应杭的文章, 再看了链接 函数的闭包、作用域跟[[Scopes]]的关系 你就懂了

最后总结

  1. 那么闭包就是 「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。
  2. 给你看个东西

image.png

  1. 可以看出js他有闭包的特性, 子函数可以访问父函数的数据, 这就是闭包
  2. 在做项目经常看老师去缓存一个变量, 学到闭包发现这样解决了内存泄漏

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享