闭包的定义、作用及使用场景

闭包的定义

闭包是能够访问其他函数作用域中变量的函数。当一个内部函数引用了外部函数的变量,且该内部函数在外部函数执行完毕后仍存在(如被返回、赋值给全局变量等),就会形成闭包。此时,外部函数的作用域不会被销毁,因为内部函数仍持有对其变量的引用。

闭包的作用

  1. 延长变量生命周期
    函数执行后,其局部变量通常被销毁。闭包使内部函数保留对外部变量的引用,变量得以持续存在。

  2. 创建私有变量
    闭包可以封装数据,外部无法直接访问,只能通过特定方法操作,模拟私有变量(如计数器案例)。

  3. 避免全局污染
    通过闭包隔离变量,减少全局变量的使用,提升代码可维护性。

使用场景 

 模块化开发:隐藏内部实现,暴露接口:

const module = (() => {
  let privateVar = 0;
  return {
    increment: () => privateVar++,
    getValue: () => privateVar
  };
})();

循环中的定时器:保留上下文信息

var lis = document.querySelector('.test').querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
  // var fc = function (i) {
  //   setTimeout(function () {
  //     console.log(lis[i].innerHTML);
  //   }, 3000);
  // };
  // fc(i);
  (function (i) {
    setTimeout(function () {
      console.log(lis[i].innerHTML);
    }, 3000);
  })(i);
}

柯里化:分步传递参数,延迟计算

const add = a => b => a + b;
const add5 = add(5);
console.log(add5(3)); // 8

注意事项

  内存泄漏:闭包可能导致变量无法被回收,需及时解除无用引用(如置为null)。

  循环中的闭包:避免在循环中直接引用循环变量,可用let或IIFE(立即执行函数)解决

总结

闭包通过函数嵌套和变量引用,实现了作用域链的延续,是封装数据和功能的强大工具。合理使用闭包能提升代码的模块化和安全性,但需注意内存管理和作用域陷阱。

你可能感兴趣的:(java,前端,javascript)