简单理解闭包

140 阅读2分钟

这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

闭包定义 函数A中的函数B,能够访问函数A中的变量,函数B就是一个闭包,闭包的变量是存储在堆内存中。

function A(){
var a="外面的变量"
    window.B=function(){
    console.log(a);
}
}

这部分代码证明了不必须要return函数才是闭包

闭包的意义 就是能够间接的访问函数内部变量

闭包的作用 1.想要改变函数的变量,但是我想要规律的改变,而不是随意更改

举例:有规律的改变金钱

function A() {
  var money = 10000;
  function set() {
    money = money + 10;
    return money;
  }
  function get() {
    money = money - 10;
    return money;
  }
  return {
    set: set,
    get: get,
  };
}
console.log(A.set());

2.想要保存延长函数的生命周期

举例:

我想呀保证一个大函数的中的小函数生命周期(这个小函数依赖大函数的变量),那么通过return返回回来,通过变量存储保存。

function A(){
    var a="外部变量"function B(){
console.log(a);
}
return B;
}

具体应用项目实例:

1.迭代器,生成器

2.缓存数据,函数科里化

在我们做项目的时候,经常遇到一些数据非常大且没有必要进行及时查询的数据。如下拉框数据等。那么在此时我们可以在启动应用的时候在页面将这些数据进行缓存起来,如果缓存中有我们需要的数据则直接读缓存,如果缓存中没有我们需要的数据,则进行查询数据库。闭包可以为我们做到这点。

var CachedSearchData = (function() {
  var cacheData = [],
    count = cacheData.length;
  return {
    getSearchData: function(id) {
      if (id in cacheData) {
        //如果结果在缓存中
        return cacheData[id];
        //直接返回缓存中的对象
      } else {
        //到数据库中查找
        alert('search in database');
      }
    },
    clearSearchData: function(id) {
      if (dsid in cache) {
        cache[dsid].clearSelection();
      }
    },
  };
})();
CachedSearchData.getSearchData(77);

弊端:

增加生存周期这个内容,是采用全局变量来封存传回来的局部函数函数体,就是全局变量的指针指向的这个闭包封存局部函数,如果要消除这个内容,就必须要将这个全局变量指针消除指向,那么系统就会将他的赋值变为垃圾内容被清理出去。f=null.很多没有清除造成了内存泄漏,到达一定数量就会造成内存溢出,内存溢出就是代码所需要的内存大于所能提供的内存。

内存泄露 1.全局变量

2.闭包

3.定时器等