了解 你会怎么样?JavaScript 封闭包装的概念(如函数、变量等)。)但不了解封闭包装本身的人解释 JavaScript 闭包?9 w+ l$ m1 b& }0 S' j
4 b$ U+ G! J9 k( `* c# ` 解决方案: ~4 ]- T e, u( R, a 闭包是一对:- M% K0 L0 Y8 J7 I! l! J- e$ i
[ol]和2 H: j& ~5 H2 i; o4 N- U3 k
引用函数外部作用域(词法环境)[/ol]词法环境是每个执行上下文(堆栈帧)的一部分,是标识符(即局部变量名称)和值之间的映射。' E$ Y% M( Z. P, H; i
JavaScript 中的每个函数都保持引用其外部词法环境。这个引用是在配置调用函数时创建的执行上下文。该引用使函数内部代码能够查看函数外部声明的变量,无论何时何地调用函数。 & t ^# g9 t6 l( j1 {如果一个函数被一个函数调用,而这个函数被另一个函数调用,它将创建一个引用链,指向外部词法环境。这个链被称为功能域链。8 u1 t$ A! Y$ B) S: q( E! g
在下面的代码中,inner使用foo调用时创建的执行上下文的词法环境形成一个闭包,关闭变量secret:) E' [# c+ j* S# V* ^) B
function foo() { const secret = Math.trunc(Math.random()*100) return function inner() { console.log(`The secret number is ${secret}.`) }}const f = foo() // `secret` is not directly accessible from outside `foo`f() // The only way to retrieve `secret`,is to invoke `f` 4 w; H, y# v* G
function createObject() { let x = 42; return log() { console.log(x) , increment() { x , update(value) { x = value }}}const o = createObject()o.increment()o.log() // 43o.update(5)o.log() // 5const p = createObject()p.log() / 42 5 f& a v( s! o- `) {5 {2 {* {