【谈谈对闭包的理解】

闭包

闭包就是能够读取其他函数内部变量的函

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域

闭包的特性:

函数内再嵌套函数 内部函数可以引用外层的参数和变量 参数和变量不会被垃圾回收机制回收

使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念

闭包 的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中

闭包的另一个用处,是封装对象的私有属性和私有方法

好处:能够实现封装和缓存等;

坏处:就是消耗内存、不正当使用会造成内存溢出的问题

使用闭包的注意点

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露
解决方法是,在退出函数之前,将不使用的局部变量全部删除 举出闭包实际场景运用的例子

比如常见的防抖节流
// 防抖

function debounce(fn, delay = 300) {
    
    
  let timer; //闭包引用的外界变量
  return function () {
    
    
    const args = arguments;
    if (timer) {
    
    
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
    
    
      fn.apply(this, args);
    }, delay);
  };
}

使用闭包可以在 JavaScript 中模拟块级作用域

function outputNumbers(count) {
    
    
  (function () {
    
    
    for (var i = 0; i < count; i++) {
    
    
      alert(i);
    }
  })();
  alert(i); //导致一个错误!
}

闭包可以用于在对象中创建私有变量

var aaa = (function () {
    
    
  var a = 1;
  function bbb() {
    
    
    a++;
    console.log(a);
  }
  function ccc() {
    
    
    a++;
    console.log(a);
  }
  return {
    
    
    b: bbb, //json结构
    c: ccc,
  };
})();
console.log(aaa.a); //undefined
aaa.b(); //2
aaa.c(); //3

猜你喜欢

转载自blog.csdn.net/demotang1/article/details/141674285