词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写 代码时将变量和块作用域写在哪里来决定的

    注意:无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处 的位置决定。

    tips:大部分标准语言编辑器第一个工作阶段1叫做词法化,词法化的过程会对源代码中的字符进行检查

    “遮蔽效应”:作用域查找会在找到第一个匹配的标识符时停止。在多层的嵌套作用域中可以定义同名的
    标识符,这叫作“遮蔽效应”(内部的标识符“遮蔽”了外部的标识符)。

    全局防遮蔽:全局变量会自动成为全局对象(比如浏览器中的 window 对象)的属性,因此
    可以不直接通过全局对象的词法名称,而是间接地通过对全局对象属性的引
    用来对其进行访问。
    window.a
    通过这种技术可以访问那些被同名变量所遮蔽的全局变量。但非全局的变量 如果被遮蔽了,无论如何都无法被访问到。

    欺骗词法作用域的性能消耗:js引擎在编一阶段进行性能优化,有一些优化可以根据代码的词法进行静态分析,可以预先确定所有变量核函数定义的位置,可以在执行过程中快速找到标识符。但是因为eval和with会修改词法作用域环境,会导致js引擎无法在编译时对作用域查找进行优化。