闭包是JS的语法特性
函数+自由变量的组合形成闭包
什么是自由变量?
- 一个变量在当前作用域没有定义,但是被使用了
- 向上级作用域一层一层依次寻找,直到找到为止
- 如果到全局作用域都没找到,则报错 xx is not defined
- JavaScript使用的是词法作用域(静态作用域),函数的作用域在定义的时候就被确定了,查找自由变量的时候是在函数定义的地方查找,而不是函数调用的地方查找
闭包有两种表现形式
- 函数作为参数被传递 ```javascript function print(fn) { let a = 200 fn() } let a = 100 function fn(){ console.log(a) }
print(fn) // 100
- 函数作为返回值被返回
```javascript
function create() {
let a = 100
return function(){
console.log(a)
}
}
let fn = create()
let a = 200
fn() // 100
闭包的作用:
- 避免污染全局环境。(因为用的是局部变量)
- 创建私有变量(隐藏变量),使其只能被间接访问
- 延长变量生命周期,使其不被垃圾回收。
闭包的缺点
变量常驻内存,可能导致内存占用过多,影响页面性能