书摘&心得
1 作用域是什么?
- 作用域是用来存储数据的地方。【4 】
- 关于编译
- 编译就是拆分代码再组织起来,让计算机能理解
- javascript比较复杂,会在编译过程中进行优化
- 引擎&编译器&作用域
- 引擎就像图书管理员,拿着代码、根据作用域做事
- 编译器就像图书录入员,拿着数据分析,记录入作用域,并且给引擎准备代码
- 作用域就是图书馆的书架,是引擎的好兄弟,有好多层。
- LHS就是查找借书的人,RHS就是查找要借的书。【9】
找不到书会抛出ReferenceError,找不到人会创造一个人来拿书(严格模式下抛错)【12】
2 词法作用域
作用域在哪?出生的地方在哪就在哪。【15】
骗术,假的出生证明,严格模式下会被识破或禁用:eval、with
3 函数作用域和块作用域
作用域泡是不透明泡泡(单面玻璃),内层泡泡的内容对外层是隐藏的
- 第三方库需要把内部私有函数和变量隐藏起来,避免冲突【25】
- 创建一个命名空间对象,把要暴露给外界的功能给挂上去
- 用一对括号包装函数,就形成了一个隐形的泡泡【27】
- 在隐形的泡泡后跟上一对小括号就变身成为立即执行函数IIFE【28】
- 隐形的泡泡的小括号可以继续传参、甚至是函数【29】
-
4 提升
声明和赋值在编译阶段会被拆开来,声明会提升,赋值不会。
- 函数优先(无条件、不可打断)【41】
-
5 作用域闭包
闭包三巨头
- 桥梁(是一个函数)
- 我生在苏州,在苏州得到了XXX,我到了南京,我记住了XXX并使用它。【44】
- 闭包是对作用域的引用,是一种记忆,是我对XXX的记忆。
- 我要去发挥光和热,离开我的出生地去南京打工,坐高铁还是轿车呢,这不重要。【46】
- 苏州(定义桥梁的作用域)
- 有一个函数出生了,我的XXX你都可以用哦,因为只要你在我就在。
- 南京(调用桥梁的作用域)
- 一个函数坐高铁来了,它从苏州带来了XXX,让它展示一下如何使用XXX吧!
- 桥梁(是一个函数)
- 使用回调基本上就是在使用闭包(除非回调函数啥都不用!)
- 通常认为IIFE是经典的闭包,但并不绝对
- 面试闭包笔试题(闭包与循环)【50】
- 其实就是循环条件用var声明,创建的是全局变量,打印的对象始终是同一个值的引用。
- 同一本书,一天撕一页存起来,引擎打印的时候拿的是同一本书,被撕了6页。
- 一本书6个副本,分开撕,引擎打印的时候拿的是6本不同的副本。
- 解决方案一:用立即执行函数创建作用域拷贝全局变量(拷贝同一本书的副本)
- 解决方案二:用let劫持for循环的作用域(直接拿6本书)
- 模块模式
- 条件:调用一个封闭函数、这个封闭函数返回至少一个桥梁函数
- 把桥梁函数放进对象里,并给这个API对象取个名字
- 桥梁函数和封闭函数的其他成员在一个作用域里
- 桥梁函数可以对其他成员为所欲为(HACK的前提)【54】
- 应用:《Hack:深入javaScript》https://shimo.im/docs/HCJPQJjrH3Khgk9Q
- 精心培养一个间谍函数,将其与必然会执行的桥梁函数偷天换日,偷偷加点料
- 精心培养的间谍被调用,通过闭包实现了HACK