Published on

你不知道的JavaScript读书笔记上(第二部分)

Authors
  • avatar
    Name
    谢克成
    Twitter

第一部分

作用域和闭包

一、作用域是什么

二、词法作用域

三、函数作用域和块级作用域

四、提升

变量提升

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 ==模块==

模块模式具备的两个必要条件

  1. 必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块 实例)。

  2. 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并 且可以访问或者修改私有的状态。