

新闻资讯
技术学院闭包是函数与其词法作用域的组合,使函数能访问并记住创建时环境中的自由变量;即使外层函数执行完毕,只要内层函数仍存在,引擎就会保留其作用域。
闭包是 JavaScript 中一个核心但容易被误解的概念。它不是某种语法结构,而是函数与其词法作用域的组合——简单说,就是一个函数记住了它被创建时所处的环境,并能在之后继续访问这个环境里的变量。
所谓“自由变量”,是指函数内部没有定义、也没有作为参数传入,但能在函数中访问的变量。这些变量来自外层函数(或全局)作用域。当内层函数在外部被调用时,如果还能访问这些变量,就形成了闭包。
关键点在于:即使外层函数已经执行完毕、本该销毁其执行上下文,只要内层函数还存在(比如被返回、被保存),JavaScript 引擎就会保留那个外层作用域,供闭包使用。
示例:
function createCounter() {这里 createCounter 执行后本该释放 count,但返回的匿名函数仍能读写它——这就是闭包在起作用。
闭包天然支持数据隐藏。通过外层函数定义变量,只暴露有限接口(如返回的函数),可防止外部直接访问或篡改内部状态。
循环中为多个元素绑定事件时,若直接使用循环变量,常出现“所有回调都用最后一个值”的问题。闭包可解决:
for (let i = 0; i buttons[i].onclick = function() {上面用了 let(块级作用域),本质也是闭包机制在支撑。若用 var,则需手动构造闭包:
闭包让“生成函数”变得自然:根据初始参数预先设定部分行为,返回一个定制化的新函数。
const logError = makeLogger('[ERROR]')
const fetchUser
= createApiCaller('/api/users')
闭包很强大,但也带来内存和性能考量: