可以这样说 作用域是因为函数的产生而产生的 作用域属于一个函数
    每个javascript函数都是一个对象 对象中有些属性我们可以访问 但有些不可以 这些属性仅供javascript引擎存取
    [[scope]]就是其中一个 [[scope]]指的就是我们所说的作用域** 其中存储了执行期上下文的集合
    作用域链:
    [[scope]]中所存储的执行期上下文对象的集合 这个集合呈链式链接 我们把这种链式链接叫做作用域链
    执行期上下文:
    当函数执行时 会创建一个称为执行期上下文的内部对象
    一个执行期上下文定义了一个函数执行时的环境
    函数每次执行时对应的执行期上下文都是独一无二的 所以多次调用一个函数会导致创建多个执行期上下文
    当函数执行完毕 执行期上下文被销毁
    查找变量:**
    从作用域链的顶端依次向下查

    例:
    image.png
    作用域链详解:
    a函数定义时
    W3WO@]]`MU606S0X@{DEE(N.png
    a函数被执行时
    %NOLZQIA47JCMNLGK{V3P3Y.png
    同理 b函数定义时 因为b函数处在a函数的作用域中 所以相当于a把自己的作用域引用给了b的scope
    _BCBG(3%()J865`[(F}PX_7.png](https://cdn.nlark.com/yuque/0/2021/png/12773302/1618927862605-cd91a2eb-c678-4c17-b7f4-9da4049fbfa7.png#align=left&display=inline&height=431&margin=%5Bobject%20Object%5D&name=_BCBG%283%25%28%29J865%60%5B%28F%7DPX_7.png&originHeight=558&originWidth=730&size=288125&status=done&style=none&width=564)<br />b函数被执行时  b也会生成自己的执行期上下文  且将b的AO放在作用域的最顶端<br />![ZIXAWCT}M9QRT3N2OHMO]MV.png
    此时查找变量的顺序即按作用域从上至下查找
    每次a函数执行完后 a的执行期上下文就会被销毁(即scope chain链接AO的线断了)
    因为a函的AO中存有函数b 那么a函数执行完后 销毁AO 那么b函数也就没了
    此时a函数就等待下次被调用时 再创建新的AO来链接到a的scope chain中
    然后因为a函数产生了新的AO 所以又产生了一个全新的b函数的定义
    b函数执行后又会产生新的b函数的AO 执行完销毁
    a函数执行完 也销毁AO
    上述的操作 周而复始