.浏览器加载页面的时候会把代码放到栈内存(ECStack)中执行
函数执行的时候会形成私有的上下文(EC),这个上下文可能被释放,也可能不会被释放。不论是否释放。都会有保护和保存的作用。
保护:划分一个独立的代码执行区域。在这个区域中有自己私有变量存储的空间(AO),而用到的私有变量和其他区域中的变量不会产生任何的冲突
保存:如果该执行上下文不被销毁,那么存储的私有的变量也不会被销毁,可以被其下级上下文中调取使用。
我们把函数执行形成的私有上下文有保存和保护的这种机制叫做闭包
闭包的作用及真实项目中的应用场景,以及所带来的问题,闭包引发的高级编程技巧。
应用场景:
1)将自己写的模块内容基于闭包包起来,这样自己编写的代码都是私有的,防止和全局的变量和代码发生冲突。这一点利用了闭包的保护机制。
2)在没有用LET之前,我们循环处理事件绑定,在事件触发需要用到索引值的时候,我们基于闭包,把每一轮循环的索引值保存起来,这样来实现我们的需求,只不过现在都是基于LET完成的,因为LET会产生块级作用域来保存需要的内容
缺点:过多使用闭包,形成多个不被释放的私有上下文,占据过多的栈空间,会导致页面渲染变慢,所以要合理使用闭包。
高级应用:
除了以上传统的业务开发中会应用到闭包。别人的源码和自己写的
插件,往往会利用一些JS高阶编程技巧来实现代码的管理和功能的开发,它们的底层机制就是闭包。例如:惰性函数、柯里化函数、compose函数