Abiel1024 / blog

Abiel's blog

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

闭包基础

Abiel1024 opened this issue · comments

commented

概念:

   闭包是指有权访问另一个函数作用域中的变量的函数。

如何创建一个闭包?

var k = 10
console.log(k)
function makeCounter() {
  var k = 0;
  return function() {
    return ++k;
  };
}
const counter = makeCounter();
console.log(counter());  // 1
console.log(counter());  // 2

makeCounter中的私有变量,被return返回的函数中引用了,counter获取了makerCounter中的返回值。所以虽然counter是在全局作用域,却能访问到makeCounter函数中的私有变量。按照定义,这么一个函数就称为闭包,即counter可以称作闭包函数。

闭包中的作用域链

之前说到了作用域链是_保证对执行环境有权访问的所有变量和函数的有序访问_。
当执行counter函数内部时,作用域链是怎么样的呢?
image
通过Chrome调试工具,可以看到执行闭包函数时作用域:
image

闭包的优缺点

优点:

1.保护函数内的变量安全,加强了封装性 
2.在内存中维持一个变量(用的太多就变成了缺点,占内存) 
闭包之所以会占用资源是当函数a执行结束后, 变量i不会因为函数a的结束而销毁, 因为b的执行需要依赖 
a中的变量。

缺点:

闭包有一个非常严重的问题,那就是内存浪费问题,这个内存浪费不仅仅因为它常驻内存,更重要的 
是,对闭包的使用不当会造成无效内存的产生,需要手动的清理机制。

闭包的应用

闭包主要应用场景是:模块化与柯里化。涉及到的知识点比较多了,接下来在仔细说说吧。