词法作用域;闭包;模块模式;HACK;IIFE ;

书摘&心得

1 作用域是什么?

  • 作用域是用来存储数据的地方。【4 】
  • 关于编译
    • 编译就是拆分代码再组织起来,让计算机能理解
    • javascript比较复杂,会在编译过程中进行优化
  • 引擎&编译器&作用域
    • 引擎就像图书管理员,拿着代码、根据作用域做事
    • 编译器就像图书录入员,拿着数据分析,记录入作用域,并且给引擎准备代码
    • 作用域就是图书馆的书架,是引擎的好兄弟,有好多层。
  • LHS就是查找借书的人,RHS就是查找要借的书。【9】
  • 找不到书会抛出ReferenceError,找不到人会创造一个人来拿书(严格模式下抛错)【12】

    2 词法作用域

  • 作用域在哪?出生的地方在哪就在哪。【15】

  • 骗术,假的出生证明,严格模式下会被识破或禁用:eval、with

    3 函数作用域和块作用域

  • 作用域泡是不透明泡泡(单面玻璃),内层泡泡的内容对外层是隐藏的

  • 第三方库需要把内部私有函数和变量隐藏起来,避免冲突【25】
    • 创建一个命名空间对象,把要暴露给外界的功能给挂上去
  • 用一对括号包装函数,就形成了一个隐形的泡泡【27】
    • 在隐形的泡泡后跟上一对小括号就变身成为立即执行函数IIFE【28】
    • 隐形的泡泡的小括号可以继续传参、甚至是函数【29】
  • let会劫持当前作用域,生成了一个新的泡泡填充块

    4 提升

  • 声明和赋值在编译阶段会被拆开来,声明会提升,赋值不会。

  • 函数优先(无条件、不可打断)【41】
  • 后面的函数会覆盖前面的

    5 作用域闭包

  • 闭包三巨头

    • 桥梁(是一个函数)
      • 我生在苏州,在苏州得到了XXX,我到了南京,我记住了XXX并使用它。【44】
      • 闭包是对作用域的引用,是一种记忆,是我对XXX的记忆。
      • 我要去发挥光和热,离开我的出生地去南京打工,坐高铁还是轿车呢,这不重要。【46】
    • 苏州(定义桥梁的作用域)
      • 有一个函数出生了,我的XXX你都可以用哦,因为只要你在我就在。
    • 南京(调用桥梁的作用域)
      • 一个函数坐高铁来了,它从苏州带来了XXX,让它展示一下如何使用XXX吧!
  • 使用回调基本上就是在使用闭包(除非回调函数啥都不用!)image.png
  • 通常认为IIFE是经典的闭包,但并不绝对
    • image.png
  • 面试闭包笔试题(闭包与循环)【50】

image.png

  • 其实就是循环条件用var声明,创建的是全局变量,打印的对象始终是同一个值的引用。
    • 同一本书,一天撕一页存起来,引擎打印的时候拿的是同一本书,被撕了6页。
    • 一本书6个副本,分开撕,引擎打印的时候拿的是6本不同的副本。
  • 解决方案一:用立即执行函数创建作用域拷贝全局变量(拷贝同一本书的副本)
  • 解决方案二:用let劫持for循环的作用域(直接拿6本书)
    • 模块模式
  • 条件:调用一个封闭函数、这个封闭函数返回至少一个桥梁函数
  • 把桥梁函数放进对象里,并给这个API对象取个名字
    • 桥梁函数和封闭函数的其他成员在一个作用域里
    • 桥梁函数可以对其他成员为所欲为(HACK的前提)【54】
    • 精心培养一个间谍函数,将其与必然会执行的桥梁函数偷天换日,偷偷加点料
    • 精心培养的间谍被调用,通过闭包实现了HACK