理解闭包前需要些什么知识?
- Javascript的数据类型:
- 基本数据类型:String、Number、Boolean、Null、Undefined、Symbol
- 引用数据类型(又叫复杂数据类型):Object、Array、Function
- 普通函数的执行空间
function fn(){ let num = 100 console.log('函数执行空间') } fn()
- 函数定义阶段:
- 在堆中开辟一个空间
- 把函数中的代码一模一样的存放进去(不解析变量)
- 把空间地址赋值给变量名,也就是函数名
2.函数的调用阶段:
- 按照函数名存储的空间地址找到空间
- 进行形参赋值
- 预解析
- 在调用栈区域里单独开辟一个空间
- 把之前存储在堆中的代码放在调用栈开辟的空间中执行(解析变量)
- 把新开辟出来的执行空间销毁
不被销毁的函数执行空间:
function fn(){ let num = 100 console.log('num ',num) return {} } // 函数fn返回一个复杂数据类型,赋值给外部变量f, // 此时 函数调用栈空间将不会被销毁 let f = fn()
- 当函数内部返回了一个复杂数据类型的时候
- 并且在函数外部还有变量在接收的时候
- 这个函数执行空间就不会被销毁,会一直存在
不被销毁的空间能不能被销毁?
当外部接收的变量不再引用这函数执行空间内部的这个复杂数据类型的时候,这个函数执行空间就销毁了。
闭包的形成条件:
- 不被销毁的函数执行空间
- 内部函数使用外部函数的变量
- 外部变量引用内部函数
闭包函数的自调用写法:
(function () { // 闭包环境定义的变量都是私有变量 let num = 100 return function fn() { console.log('num ', num) } })();
闭包函数的优点:
1.缓存
2.面向对象中的对象
3.实现封装,防止变量跑到外层作用域中,发生命名冲突
4.匿名自执行函数,匿名自执行函数可以减小内存消耗
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!