简单理解 js 闭包,只要记住一句话两个表现
一、什么是闭包
一个函数和对其周围状态的引用捆绑在一起,这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
上面这段话来自 MDN,有点抽象,可以先不管,大概知道就行。
解读一下就是:闭包是一个组合:一个函数 + 周围状态的引用
二、一句话两个表现
先记住一句话就行:闭包最常见的两个表现就是,函数作为参数被传递,函数作为返回值被返回。
表现一:函数作为参数被传递
function aFn(fn) {
const aaa = 100,
bbb = 200
fn()
}
const aaa = 0,
bbb = 0
function bFn() {
console.log(aaa, bbb) // 0 0
}
aFn(bFn)
表现二:函数作为返回值被返回
function cFn(fn) {
const ccc = 100,
ddd = 200
return function () {
console.log(ccc, ddd) // 100 200
}
}
const ccc = 0,
ddd = 0
const dFn = cFn()
dFn()
三、帮助理解的小提示
-
闭包实际上变量作用域应用的特殊情况。
-
闭包自由变量的查找,是在函数定义的地方向上级作用域查找,而不是在执行的地方向上级查找。
-
自由变量:当前作用域未定义的变量。
-
函数执行的上下文,不是本身的词法作用域。
function a() { const c = 'ccc' return function () { console.log(c) } } const b = a() b() // b 函数的执行上下文是 window,但是它的本身的词法环境在它定义的地方,即 a 函数 return 的 function