产生闭包的原因
根据词法作用域规则,内部函数总是能够访问到外部函数的变量。当外部函数执行完毕出栈时,内部函数用到的变量和函数不能被销毁,把这些函数和变量称为外部函数的闭包
使用场景
- 模仿块级作用域
// ES6之前没有块级作用域,可以使用闭包模拟
for (var i = 0; i < 5; i++) {
(function closure(j) {
setTimeout(() => {
console.log(j)
}, 0)
})(i)
}
- 创建私有变量,如commonjs模块化
function privateVariable() {
let _name = 'jack';
return {
getName() {
return _name;
}
}
}
let obj = privateVariable();
console.log(obj.getName()) // 'jack'
tips
- 函数编译阶段即可确定是否存在闭包,如果内部函数不依赖外部变量和方法,就不会形成闭包。
- 闭包单独存放在堆上,只有内部函数可以读写
- 使用闭包要谨慎,防止内存泄漏