彻底弄懂Javascript闭包
基础概念
什么是闭包
简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数。
为什么需要闭包呢
局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。
特点
- 占用更多内存
- 不容易被释放
如何使用 1.定义外层函数,封装被保护的局部变量。
2.定义内层函数,执行对外部函数变量的操作。
3.外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。
函数生命周期 直接上图,点击图片方法查看。要记住函数对象、作用域链对象、执行环境(EC)和活动对象(AO)这几个东西都啥时候出现,啥时候消失。
文章图片
函数生命周期 例子实战
看下面这个函数,函数对象的地址仅作标识,不代表真实的地址。
var getNum;
//------------------------1
function getCounter() { // ----------2
var n = 1;
var inner = function () { return n++;
}
return inner;
}getNum = getCounter();
//------------3
console.log(getNum());
//1 ---------4
console.log(getNum());
//2 ---------5
程序运行到2的时候:
文章图片
运行到2 程序运行到3的时候:
文章图片
运行到3 运行到4的时候,外层函数调用结束,AO对象释放,图中红线断了:
文章图片
4处的代码执行前 4处的代码执行时:
文章图片
执行4处的代码 4处的代码执行完:
文章图片
4处代码执行完 【彻底弄懂Javascript闭包】总结:可以看到内层函数对象被全局的变量getNum引用,所以内层函数相关的AO对象,作用域链对象在函数调用完都无法被内存回收,因此占用了更多的内存空间,但是这样持久的保存了需要的
n
。推荐阅读
- 事件代理
- 数组常用方法一
- 陷入父母的心理战,孩子被彻底打败
- 【图解】9张图彻底搞懂堆排序
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- JavaScript|JavaScript之DOM增删改查(重点)
- 【读书笔记】JavaScript|【读书笔记】JavaScript DOM编程艺术 (第2版)