首先来看一道开放题:谈谈你对闭包的理解,以及在项目中的应用!
- 阐述闭包是什么?(引申:堆栈、EC、AO、VO、SCOPE…)
- 闭包的作用及在真实项目中的应用场景,以及所带来的问题!
- 由闭包引发的高阶编程技巧
- 突出自己在分析研究框架的源码(逼格更高的是自己写类库、插件的时候)是怎么应用这些东西的!
建议:浏览器加载页面会把代码放到栈内存中执行(也就是ECStack),函数进栈执行会产生一个私有的上下文(也就是EC),此上下文能保护里面的私有变量(也就是AO)不受外界的干扰,并且如果当前上下文中的某些内容,被上下文以外的内容所占用,当前上下文是不会出栈释放的,这样可以保存里面的变量和变量值,所以我认为闭包是一种保存和保护内部私有变量的机制…在真实的项目中,其实我应用闭包的场景还是很多的,例如:
- 我会基于闭包把自己编写的模块内容包起来,这样自己编写的代码都是私有的,防止和全局变量或者别人的代码冲突,这一点利用的是闭包的保护机制
- 在没有用LET之前,我们循环处理事件绑定,在事件触发需要用到索引值的时候,我们基于闭包,把每一轮循环的索引值保存起来,这样来实现我们的需求,只不过现在都是基于LET来完成,因为LET会产生块级作用域来保存需要的内容(机制和闭包类似)
但是不建议过多使用闭包,因为形成不被释放的上下文,是占用栈内存空间的,过多使用会导致页面渲染变慢,所以要合理应用闭包
除了这些传统的业务开发中会应用闭包,我之前在研究别人源码和自己写一写插件的时候,往往会利用一些JS高阶编程技巧来实现代码的管理和功能的开发,他们的底层机制其实就是闭包,例如:
- 惰性函数
- 柯理化函数
- compose函数
…
惰性函数
DOM0事件绑定:xxx.οnclick=function(){}
DOM2事件绑定:xxx.addEventListener(‘click’,function(){}),只不过不兼容IE6~8,IE低版本浏览器中是基于 xxx.attachEvent(‘onclick’,function(){}) 实现的
//实现可以兼容各种事件