标准说法:「函数」和「函数内部跨作用域能访问到的变量」的总和,就是一个闭包。
闭包使得函数内部可以访问该函数声明时所处作用域中的变量
通俗说法:函数嵌套的时候,内层函数访问外层函数的标识符就是一个闭包。
闭包的作用,就是使得原本执行环境出栈后会销毁的标识符得到了保留,形成了一个独立的作用域
// 1.0 一定有一个外层的函数
function outFn(x) {
// 2.0 一定会返回一个内层函数
return function(y) {
// 3.0 内层函数使用了外层函数的标识符
return x + y
}
}
var innerFn = outFn(100)
innerFn(123) // 223
innerFn(666) // 766
闭包的优缺点
// 优点
// 1.0 闭包使得原本执行环境出栈后会销毁的标识符得到了保留
// 2.0 延展了作用域,在控制台的sources的scope(作用域)中看到了一个 closure
// 3.0 实现了数据安全,减小了全局污染,可以创建多个闭包
// 缺点
// 1.0 原本应该销毁的标识符得到了保留,导致内存增加,消耗性能(所以不要滥用闭包)
// 2.0 书写起来麻烦