Open Abiel1024 opened 6 years ago
闭包是指有权访问另一个函数作用域中的变量的函数。
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可以称作闭包函数。
makeCounter
return
counter
makerCounter
之前说到了作用域链是保证对执行环境有权访问的所有变量和函数的有序访问。 当执行counter函数内部时,作用域链是怎么样的呢? 通过Chrome调试工具,可以看到执行闭包函数时作用域:
优点:
1.保护函数内的变量安全,加强了封装性 2.在内存中维持一个变量(用的太多就变成了缺点,占内存) 闭包之所以会占用资源是当函数a执行结束后, 变量i不会因为函数a的结束而销毁, 因为b的执行需要依赖 a中的变量。
缺点:
闭包有一个非常严重的问题,那就是内存浪费问题,这个内存浪费不仅仅因为它常驻内存,更重要的 是,对闭包的使用不当会造成无效内存的产生,需要手动的清理机制。
闭包主要应用场景是:模块化与柯里化。涉及到的知识点比较多了,接下来在仔细说说吧。
概念:
如何创建一个闭包?
makeCounter
中的私有变量,被return
返回的函数中引用了,counter
获取了makerCounter
中的返回值。所以虽然counter
是在全局作用域,却能访问到makeCounter
函数中的私有变量。按照定义,这么一个函数就称为闭包,即counter
可以称作闭包函数。闭包中的作用域链
之前说到了作用域链是保证对执行环境有权访问的所有变量和函数的有序访问。 当执行counter函数内部时,作用域链是怎么样的呢? 通过Chrome调试工具,可以看到执行闭包函数时作用域:
闭包的优缺点
优点:
缺点:
闭包的应用
闭包主要应用场景是:模块化与柯里化。涉及到的知识点比较多了,接下来在仔细说说吧。