本文首发于个人网站:「一名前端攻城师的个人修养」。
在一般情况下,函数外部无法直接读取函数内部声明的变量:
function add(x) {
let y = 2
console.log(x + y)
}
console.log(2)
// 4
console.log(y)
// Uncaught ReferenceError: y is not defined
但是实际情况下,我们可以需要得到函数内部的局部变量。像上面的这种正常情况下是办不到的,但是我们可以通过变通的方式实现,在函数内部再定义一个函数:
function add(x) {
let y = 2
console.log(x + y)
let getValue = function() {
return y
}
return getValue
}
let result = add(2)
console.log(resule())
闭包就是上面的 getValue
函数:可以读取其他函数内部的函数,通常在嵌套函数中实现。
由于我们只能在函数内部的才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的最大用处有两个:
- 读取外层函数内部的变量,同时让这些变量始终保持在内存中。因此,闭包的存在可以使得这些变量所处的诞生环境一直存在。
- 封装对象的私有属性和私有方法。
外层函数每次运行,都会生成一个新的闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。因此不能滥用闭包,否则会造成网页的性能问题。