美文网首页
上卷 第一部分 第二章 词法作用域

上卷 第一部分 第二章 词法作用域

作者: nymlc | 来源:发表于2018-04-13 00:50 被阅读0次

前言

词法作用域顾名思义就是在词法阶段就决定好的作用域,就是你写代码时就决定好的(变量、块作用域写的位置)

作用域气泡

function foo(a) {
    var b = a * 2;
    function bar(c) {
        console.log( a, b, c );
    }
    bar( b * 3 );
}
foo( 2 ); // 2, 4, 12

以上面代码为例:

气泡作用域
可见它们是由编写位置所致。
变量查找是从当前作用域逐层往上查询直到全局作用域。若是查询到了第一个就停止。它只查询一级变量(a.b.c只查询a,余下的交给对象属性访问规则)。若是不同层级作用域有相同名字的变量,那么上层就会被屏蔽。
函数的词法作用域只与其所声明的位置有关,与调用位置无关。

欺骗词法作用域eval/with

eval
这家伙就是可以把一段字符串解析成函数代码。这样子若是传入声明变量的字符串代码,那么就可以修改在词法分析阶段就已经完备的词法作用域。它的特点是让代码好像就在那一样
setTimeout、new Function()均有此效果,不过后者要安全些。
with
with也可以修改词法作用域,与其说是修改不如说是凭空生成。它的特点是接受传入变量(通常是对象),然后以其属性作为作用域之内的标识符,生成新的词法作用域以达到修改已存在的词法作用域。
其内标识符均是LHS查询,若是传入的对象无引用的属性,那么会往上冒泡。
值得注意的是,with内的变量声明会添加在with语句所在的作用域。

这俩家伙最好不要使用。因为本来在词法分析阶段就决定好的作用域有了这俩货就变得不能预测,导致引擎无法在编译阶段对作用域查找进行优化(因为引擎为了谨慎起见会认为优化无效)

相关文章

  • YOU DON'T KNOW JS 笔记 2

    第二章 词法作用域 词法作用域是定义在词法阶段的作用域 由写代码时将变量和块作用域写在哪里决定 全局变量会自动成为...

  • 词法作用域&动态作用域

    词法作用域(静态作用域) 词法作用域也叫静态作用域,jsvascript为词法作用域。词法作用域关心的是你的函数申...

  • 词法作用域

    我们知道JavaScript并不具有动态作用域,它只有词法作用域,什么是词法作用域? 一、 词法作用域 词法作用域...

  • 2.词法作用域

    JavaScript的作用域模型采用的是词法作用域 词法阶段 查找 欺骗词法作用域 既然词法作用域完全由编写时来决...

  • js中的作用域

    作用域就是决定变量有效范围 作用域按决定的时期来区分可分为词法作用域和动态作用域词法作用域: 词法作用域就是作用域...

  • JS基础-作用域与闭包

    1.理解词法作用域和动态作用域 词法作用域:定义在词法阶段的作用域换言之,词法作用域是由你在写代码时将变量和块作用...

  • 你不知道的JavaScript:词法作用域

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

  • 2、词法作用域

    词法作用域 简单地说,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写...

  • 词法作用域

    作用域工作模式:1 词法作用域;2 动态作用域(Bash脚本、Perl中的一些模式) 2.1 词法阶段 词法作用域...

  • 你不知道的 Javascript

    作用域 词法作用域:编译阶段确定(欺骗词法作用域 eval with) 块作用域 with try/catch l...

网友评论

      本文标题:上卷 第一部分 第二章 词法作用域

      本文链接:https://www.haomeiwen.com/subject/ptexkftx.html