美文网首页1000天日更计划
Day16:欺骗词法的两种机制

Day16:欺骗词法的两种机制

作者: 钱塘风华 | 来源:发表于2019-04-09 22:44 被阅读0次

【书名】:你不知道的JavaScript(上卷)

【作者】:Kyle Simpson

【本书总页码】:213

【已读页码】:37

欺骗词法是指,因为词法作用域完全由写代码期间函数所声明的位置来定义,有时候需要在运行时来“修改”词法作用域的情况。

以下两种机制在严格模式下会失效。

1. eval

JavaScript 中的 eval(..) 函数可以接受一个字符串为参数,并将其中的内容视为好像在书写时就存在于程序中这个位置的代码。

默认情况下,如果 eval(..) 中所执行的代码包含有一个或多个声明(无论是变量还是函数),就会对 eval(..) 所处的词法作用域进行修改。技术上,通过一些技巧可以间接调用 eval(..) 来使其运行在全局作用域中,并对全局作用域进行修改。但无论何种情况,eval(..) 都可以在运行期修改书写期的词法作用域。

new Function(..) 函数的行为也很类似,最后一个参数可以接受代码字符串,并将其转化为动态生成的函数(前面的参数是这个新生成的函数的形参)。这种构建函数的语法比eval(..)略微安全一些,但也要尽量避免使用。

2. with

with 通常被当作重复引用同一个对象中的多个属性的快捷方式,可以不需要重复引用对象本身。

with 可以将一个没有或有多个属性的对象处理为一个完全隔离的词法作用域,因此这个对象的属性也会被处理为定义在这个作用域中的词法标识符。

尽管 with 块可以将一个对象处理为词法作用域,但是这个块内部正常的 var声明并不会被限制在这个块的作用域中,而是被添加到 with 所处的函数作用域中。

3. 注意:欺骗词法作用域会导致性能下降

JavaScript 引擎会在编译阶段进行数项的性能优化。其中有些优化依赖于能够根据代码的词法进行静态分析,并预先确定所有变量和函数的定义位置,才能在执行过程中快速找到标识符。

但如果引擎在代码中发现了 eval(..) 或 with,它只能简单地假设关于标识符位置的判断都是无效的,因为无法在词法分析阶段明确知道 eval(..) 会接收到什么代码,这些代码会如何对作用域进行修改,也无法知道传递给 with 用来创建新词法作用域的对象的内容到底是什么。

最悲观的情况是如果出现了 eval(..) 或 with,所有的优化可能都是无意义的,因此最简单的做法就是完全不做任何优化——从而导致性能下降。

相关文章

  • Day16:欺骗词法的两种机制

    【书名】:你不知道的JavaScript(上卷) 【作者】:Kyle Simpson 【本书总页码】:213 【已...

  • 词法欺骗

    1.eval “var b = 3 ” 会被当做本来就在那里一样来处理。由于那段代码声明了变量b。因此它对已经存在...

  • JS中的eval(..) 和with —— 你不知道的JavaS

    JavaScript 中有两个机制可以“欺骗”词法作用域:eval(..) 和with。前者可以对一段包 含一个或...

  • 2.词法作用域

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

  • JavaScript词法作用域

    作用域 章节直通车: 作用域词法作用域动态作用域总结 作用域的工作机制分为两种,一种是众所周知的词法作用域,另一个...

  • 你不知道的 Javascript

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

  • 欺骗词法作用域

    我们活着的每一刻背后都隐藏着成千上万个不一样的瞬间。 ——《忽然七日》 大部分情况下,词法作用域在编译阶段的第...

  • 作用域--欺骗词法

    本文章引用《你所不知道的Javascript》 代码如下: (1)eval function foo(str,a)...

  • <you don't know JS> 上卷

    this关键词是JavaScript之中最复杂的机制之一。 关于 this 和词法作用域的机制不同,this的指向...

  • 作用域(三)——欺骗词法

    在上一篇文章中,小编介绍了词法作用域,并在其中提到了两个会出现“欺骗”词法作用域的关键字——eval和with,今...

网友评论

    本文标题:Day16:欺骗词法的两种机制

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