简单理解JS闭包

何为闭包?

简单理解:

A函数内部有B函数,B函数能访问A函数的作用域(持有对原始定义作用
域的引用),A函数将B函数传递到作用域外部,当调用B函数时,可以访问到A的作用域,A作用域无法被销毁。B函数在定义时的词法作用域以外的地方被调用。闭包使得函数可以继续访问定义时的
词法作用域。

function wait(message) {
  setTimeout( function timer() {
  console.log( message );
  }, 1000 );
}
wait( "Hello, closure!" );

在引擎内部,内置的工具函数setTimeout(..) 持有对一个参数的引用,这个参数也许叫作
fn 或者func,或者其他类似的名字。引擎会调用这个函数,在例子中就是内部的timer 函
数,而词法作用域在这个过程中保持完整。

上述例子中,可以看到wait函数 执行完后,通常会期待wait() 的整个内部作用域都被销毁,看上去wait() 的内容不会再被使用,所以很自然地会考虑对其进行回收;
但是事实并非如此,wait(..) 执行1000 毫秒后,它的内部作用域并不会消失,timer 函数依然保有wait(..)作用域的闭包(还保有对变量message 的引用)。

posted @ 2022-09-26 11:28  DurianTRY  阅读(28)  评论(0编辑  收藏  举报