JavaScript闭包是函数与其定义时词法环境的组合,需满足嵌套函数、引用外部变量、在外部调用三条件;它延长变量生命周期,易因引用管理不当导致内存泄漏,应通过let声明、精简引用、及时清理和WeakMap等措施安全使用。
JavaScript闭包是指一个函数能够访问并记住其词法作用域中变量的能力,即使外部函数已经执行完毕。它不是某种特殊函数类型,而是函数与其定义时所处环境(即词法作用域)共同构成的组合。
必须同时满足三个条件:
数引用了外部函数的变量(或函数)例如:function outer() { let count = 0; return function inner() { count++; return count; }; } const inc = outer(); inc(); // 1 —— 此时 inner 就是一个闭包,它“捕获”了 outer 中的 count 变量。
正常情况下,函数执行结束,其局部变量会被垃圾回收。但一旦形成闭包,JS 引擎会保留该变量所在的整个词法环境,只要闭包还“可达”,变量就无法释放。
问题不在于闭包本身,而在于对变量引用的疏忽管理:
核心原则是:按需捕获、及时断联、避免冗余引用。