面向对象编程第五篇--笔记

作用域链

函数可以创建作用域,函数中又可以声明函数,这样就形成了作用域套作用域的链式结构,称作作用域链

变量搜索原则

  1. 现在使用变量的作用域中进行查找,如果找到了,就直接使用
  2. 如果没有找到,就去上一级作用域链中进行查找,如果找到了,就直接使用
  3. 如果没有找到,就沿着作用域链依次向上查找,直到找到全局作用域

绘制作用域链图

  1. 首先绘制0级作用域链
  2. 在全局作用域中查找变量以及函数的声明,用小方块的形式将其画在0级作用域线上
  3. 再从0级作用域链中的函数中引出下一级作用域链
  4. 重复以上步骤!!!

闭包

什么是闭包

闭包就是指可以访问独立的数据的函数!!!

闭包要解决的问题

函数内部声明的变量无法再函数外部使用

闭包的基本模型

1
2
3
4
5
6
7
function outer(){
var data = "";
function inner(){
return data;
}
return inner;
}

如何使用闭包返回多个函数

在函数内部创建一个对象,在对象中封装多个函数,返回对象,在外部就可以使用对象,访问各个方法

闭包的原理

上级作用域无法访问下级作用域中的变量,但是下级作用域可以访问上级作用域的变量

闭包的用途

  1. 可以用来保护数据, 就是变量被保护在外部函数中,想要修改变量只能通过闭包函数,可以在闭包函数中添加一些校验逻辑,以保证数据的合理性以及安全性
  2. 可以为函数新增私有的变量

使用闭包解决for循环中注册点击事件的问题

问题

点击事件在触发的时候,访问的i变量已经变成了最后一个值!!

解决方案

通过闭包来创建一个函数,该函数拥有自己独立的一个变量j,在循环的时候,将当前的i的值保存一份交给j,再将该闭包函数注册给点击事件,这样在点击事件触发的时候,就不会去访问全局的i,而是使用自己的j

使用闭包解决for循环中setTimeout代码执行的问题

缓存

将数据临时的存储起来以提高访问效率

浏览器缓存(重点)

硬件缓存

CDN(重点)

数据库缓存

使用缓存解决递归实现的斐波那契数列存在的性能问题

性能问题

由于递归实现的斐波那契数列中,存在大量的重复计算,导致性能低下

如何解决

使用缓存,将每次计算后的结果进行保存,在下次获取该数据的时候,就直接去缓存中拿,而避免了重复的计算