- Published on
你不知道的JavaScript读书笔记上(第二部分)
- Authors
- Name
- 谢克成
第一部分
作用域和闭包
一、作用域是什么
二、词法作用域
三、函数作用域和块级作用域
四、提升
变量提升
var 声明的变量会产生变量提升
a = 2
var a
console.log(a)
以上代码会解释成
var a
a = 2
console.log(a)
// output: 2
console.log(a)
var a = 2
以上代码会解释成
var a
console.log(a)
a = 2
// output: undefined
函数提升
函数提升优先于变量提升
var foo
foo()
function foo() {
console.log(111)
}
foo = function () {
console.log(222)
}
// 这段代码会输出 111 因为 函数提升优先于变量提升
五、作用域闭包
5.1 启示
闭包是基于词法作用域书写代码时所产生的自然结果,你甚至不需要为了利用它们而有意 识地创建闭包。闭包的创建和使用在你的代码中随处可见。你缺少的是根据你自己的意愿 来识别、拥抱和影响闭包的思维环境。
5.2 实质问题
5.3 闭包的定义
小红书对于闭包的定义:闭包指的是哪些引用了另一个函数作用域中变量的函数
JS 对闭包定义:
5.4 闭包的作用:
闭包可以阻止另一个函数作用域中的变量被回收
JS 垃圾处理机制:js 垃圾回收机制在时间周期内会回收不再被使用的变量
5.5 循环和闭包
for 循环可以很好的解释闭包
5.6 闭包的使用场景
在我们的代码中,闭包无处不在,只有使用到回调函数,实际上就是在使用闭包:像定时器、事件监听器、Ajax 请求、跨窗口通信、Web Workers 或者任何其他的异步(或者同步)任务中,只要使用了回调函数,实际上就是在使用闭包。
5.7 ==模块==
模块模式具备的两个必要条件
必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块 实例)。
封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并 且可以访问或者修改私有的状态。