js 闭包的概念及应用场景

1.概念

是内部函数可以访问外部函数作用域中的变量。

2.来由

由于JavaScript中的函数作用域规则和函数可以作为值传递的特性产生的

3.优点

  • 封装性(可以将变量和函数封装起来,防止外部访问和修改,提高了代码的可维护性和可重用性)
  • 保存状态(即使函数已经执行完毕,状态仍然保存,在事件处理程序可以使用)

4.缺点

  • 内存占用(他会保存内部函数的引用和外部函数的变量,如果没有及时释放闭包,会造成内存泄漏)
  • 性能问题(由于会保存外部函数的变量,导致不能被垃圾回收,尤其是在循环中)

5.常见问题

  • 内存泄漏
  • 代码不易理解和调试(闭包使用函数的作用域扩大,内部函数可以访问外部函数的变量,会增加代码的复杂度)

6.应用场景

  • 封装私有变量和方法

          闭包可以用于创建模块化的代码,可以隐藏变量和方法,只暴露需要的接口,这样可以避免全局命名空间污染,并且可以增加代码的可维护性。

var test=(function(){
var count = 0;

  function increment() {
    count++;
    console.log(count);
  }

  function decrement() {
    count--;
    console.log(count);
  }

  return {
    increment: increment,
    decrement: decrement
  };
} )()

test.increment(); // 输出 1
test.increment(); // 输出 2
test.decrement(); // 输出 1
  • 保存函数状态

          即使函数已经执行完毕,状态任然保存。例如在事件处理程序中保存计数器状态,非常有用

function test() {
  var count = 0;

  return function() {
    count++;
    console.log(count);
  };
}
let test1=test();
let test2=test();

test1();   //1
test1();  //2

test2();  //1
test2()   //2
  • 实现函数柯里化

         就是将多个参数的函数转化为接受单个参数的函数,形成函数链

function test(x){
   return function(y){
     return x+y
   }
}

let test1=test(2);
console.log(test1(3));   //5
console.log(test1(5))   //7

  

 

posted @ 2024-04-26 11:25  诉诉飞飞  阅读(4)  评论(0编辑  收藏  举报