闭包是js中很重要的概念
作用域
在说闭包前,先了解js的作用域
作用域
作用域指变量能够被访问
到的范围,也称变量作用域
全局作用域,浏览器(window), Node(global)
函数作用域 function内部
块级作用域(es6新增,let、const声明的变量)
作用域链
由于作用域层级的关系,导致出现作用域链
一般(全局作用域 包含(函数作用域 -》 包含(函数作用域和块级作用域) 和 块级作用域))
function outer(){ |
闭包
一般来说,函数作用域的变量,一旦函数执行完就会被释放
但是如果函数内部嵌套函数,而且内部函数使用外部的变量,就有可能导致外部函数变量得不到释放,
这样内部函数就可以一直访问,从而形成闭包
简单说,当前环境中存在指向父级作用域的引用
function outer(){ |
闭包的应用
once() 函数
function once(fn) { |
节流防抖中也用到了闭包
还有其他很多的例子
闭包的优缺点
- 优点:
1.可以将一个变量长期储存在内存中,用于缓存
2.可以避免全局变量的污染
3.加强封装性,是实现了对变量的隐藏和封装
- 闭包的缺点:
1.因为函数执行上下文AO执行完不被释放,所以会导致内存消耗很大,增加了内存消耗量,影响网页性能出现问题
2.而且过度的使用闭包可能会导致内存泄漏,或程序加载运行过慢卡顿等问题的出现, 所以我们可以在退出函数之前, 将不使用的局部变量进行删除