image.png
js没有块级作用域 但是可以模拟块级作用域
全局作用域的东西都相当于加到了window上了
每调用一次函数就会重新创建一个函数作用域
image.png
1 123 2

JS是解释性语言

image.png
image.png

注意 var b=function(){} 这种形式的不叫函数声明,叫函数表达式
单一的function (){} 这种形式的才叫函数声明,不能把函数赋值给变量,赋值给变量就成了函数表达式了
image.png

重要函数预编译的方法剖析

image.png
如果是一个函数 ,在执行前函数是要进行预编译的这个 如上面2张图 进行预编译
AO函数作用域对象(只有在执行这个函数的时候,然后先进行预编译,也就是创建AO对象)
作用域链(每次函数执行完都会销毁)
image.png

闭包的案例(把函数内部的变量弄到函数外面使用)
image.png

重要出现闭包的原因
image.png
执行 a函数 a函数有自己的 GO也就是全局作用域对象 里面有
image.png

重要 闭包的理解

a 函数执行前,有自己的GO 里面是 global和 function a 有自己的 AO也就是函数作用域对象 a:123
和function b
a函数只要一被调用 就没有了自己的GO和AO了,但是这个GO和AO还能被下面的函数访问到, 然后执行 function b . funtion b 执行的时候 也有自己的
GO也就是全局作用域函数对象(里面有global 和fucntion a) 自己的AO函数作用域对象function b 和 bb:234
所以 把函数return到外面,但是function b 依旧可以访问到 自己函数外面的 a 把 a返出到函数外面使用(也就是因为预编译 函数b在被调用的时候 可以访问到 自己的GO对象 ,这个GO对象里面有 a ,所以能访问到)

重要

闭包输出的变量的值,是从定义的位置开始往上找,找到的值,就是要输出的值,而不是调用这个函数的时候,在调用的时候找对应的变量值

闭包使用情况2
image.png
image.png
image.png
微信图片_20210702225436.jpg

微信图片_20210702225614.jpg

如上图 执行外部函数 内部函数不执行的情况下,就已经产生闭包了

闭包的优缺点

image.png
image.png

image.png
console.dir打印对象的属性

image.png
image.png
image.png
早期闭包用于解决for’循环中,定时打印内容的问题或者有let声明不用var
形参可以理解为函数中的局部变量
出来的是123456
image.png
image.png
image.png
闭包都是独立的谁也不会影响谁
image.png
正常情况下一个函数执行完了,函数内部的变量就会被销毁回收,如果这个函数内部形成了闭包的话,闭包函数访问的那个变量,就不会被回收,只要下面的代码,没有使用到函数内部的东西,那这个函数内部的东西,就都会在函数执行完,被销毁,如果在这个函数的下面,还有代码,依赖于函数内部的东西,那这个东西,就不会被销毁

重点


闭包的作用(闭包的常见应用就是:数据私有化)

实现数据私有化

如下图私有化,定义在函数内部,作用场景:点击一个按钮让它执行fn()函数让count++,如果count是一个普通的值,还好,如果count代表的是钱,这个时候,就有可能出现问题,因为钱比较敏感,我们不希望其他代码可以随意访问到这个钱的变量,这个时候,我们就把代表钱的这个变量声明到一个函数中,就是有必要的了,在通过闭包的形式把这个变量反到外面来使用,就解决了这个问题了,实现了数据私有化 在函数外面修改count的值,函数里面count的值不受影响(相当于没改了)

反例

image.png

改良后(利用闭包结构)

image.png