闭包

83 阅读1分钟

闭包指的是哪些引用了其它函数作用域中变量的函数,通常是在嵌套函数中实现

function outFn(){
   let name = 'tony'
   function innerFn(){
     console.log(name)
   }
   return innerFn
}

const colser = outFn()
colser() // tony

特性

私用变量

通过闭包可以创建私有变量和方法,只能通过特定的方法访问,提高代码的安全性和封装性

function createCounter(){
  let count = 0
  
  return {
    add:function(){
      count++
      console.log(count)
    }
  }
}

const closer = createCounter()
closer.add() // 1

隐藏数据

闭包允许我们隐藏数据,只暴露必要的接口,从而保护数据不被外部直接修改

回调函数和事件处理

闭包常用于设置回调函数和事件处理器,因为它们需要访问定义在外部作用域中的变量

function setupButton() { 
  let button = document.getElementById('myButton'); 
  let count = 0; 

  button.addEventListener('click', function() { 
    count++; 
    console.log('Button clicked ' + count + ' times');
  }); 
} 

setupButton();

注意事项

  • 内存泄漏:由于闭包会保留其外部函数的作用域,如果闭包一直存在,那么外部函数的变量也会一直存在,这可能导致内存泄漏。因此,要注意及时释放不再需要的闭包。

  • 性能问题:大量使用闭包可能会影响性能,因为每个闭包都会保留其外部作用域,这会增加内存消耗。