作用域链
函数可以创建作用域,函数中又可以声明函数,这样就形成了作用域套作用域的链式结构,称作作用域链
变量搜索原则
- 现在使用变量的作用域中进行查找,如果找到了,就直接使用
- 如果没有找到,就去上一级作用域链中进行查找,如果找到了,就直接使用
- 如果没有找到,就沿着作用域链依次向上查找,直到找到全局作用域
绘制作用域链图
- 首先绘制0级作用域链
- 在全局作用域中查找变量以及函数的声明,用小方块的形式将其画在0级作用域线上
- 再从0级作用域链中的函数中引出下一级作用域链
- 重复以上步骤!!!
闭包
什么是闭包
闭包就是指可以访问独立的数据的函数!!!
闭包要解决的问题
函数内部声明的变量无法再函数外部使用
闭包的基本模型
1 | function outer(){ |
如何使用闭包返回多个函数
在函数内部创建一个对象,在对象中封装多个函数,返回对象,在外部就可以使用对象,访问各个方法
闭包的原理
上级作用域无法访问下级作用域中的变量,但是下级作用域可以访问上级作用域的变量
闭包的用途
- 可以用来保护数据, 就是变量被保护在外部函数中,想要修改变量只能通过闭包函数,可以在闭包函数中添加一些校验逻辑,以保证数据的合理性以及安全性
- 可以为函数新增私有的变量
使用闭包解决for循环中注册点击事件的问题
问题
点击事件在触发的时候,访问的i变量已经变成了最后一个值!!
解决方案
通过闭包来创建一个函数,该函数拥有自己独立的一个变量j,在循环的时候,将当前的i的值保存一份交给j,再将该闭包函数注册给点击事件,这样在点击事件触发的时候,就不会去访问全局的i,而是使用自己的j
使用闭包解决for循环中setTimeout代码执行的问题
缓存
将数据临时的存储起来以提高访问效率
浏览器缓存(重点)
硬件缓存
CDN(重点)
数据库缓存
使用缓存解决递归实现的斐波那契数列存在的性能问题
性能问题
由于递归实现的斐波那契数列中,存在大量的重复计算,导致性能低下
如何解决
使用缓存,将每次计算后的结果进行保存,在下次获取该数据的时候,就直接去缓存中拿,而避免了重复的计算