美文网首页
词法欺骗

词法欺骗

作者: 小草_fdba | 来源:发表于2019-08-28 16:09 被阅读0次

1.eval

function foo(str, a){
    eval(str)
    console.log(a,b);
}                             
var b = 2;
foo('var b = 3', 1)   

“var b = 3 ” 会被当做本来就在那里一样来处理。由于那段代码声明了变量b。因此它对已经存在的foo(..)的词法作用域进行了修改。
eval()可以在运行期修改书写期的词法作用域
setTimeout() setInterval(),new function() 类似

2.with


image.png
image.png

将o1传递进去,a=2赋值操作找到了o1.a并将2赋值给他。当o2传递进去,o2并没有该属性,因此不会创建这个属性。o2.a保持undefined.
with 可以将一个没有或有多个属性的对象处理为一个完全隔离的词法作用域,因此这个对象的属性也会被处理为定义在这个作用域中的词法标识符。但是这个块内部正常的var声明并不会被限制在这个块的作用域中,而是被添加到with所处的函数作用域中。严格模式禁用with。

3.eval和with影响性能
js引擎在编译阶段进行数项的性能优化。其中有些优化依赖于能够根据代码的词法进行静态分析,并预先确定所有变量和函数的定义位置,才能在执行过程中快速找到标识符。如果引擎中出现了eval和with。只能简单的假设关于标识符位置的判断都是无效的,因为无法在词法分析阶段明确知道eval()会接受什么代码。
js引擎无法在编译时对作用域查找进行优化

相关文章

  • 词法欺骗

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

  • 2.词法作用域

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

  • 你不知道的 Javascript

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

  • 欺骗词法作用域

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

  • 作用域--欺骗词法

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

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

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

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

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

  • 2019-04-23js欺骗词法

    https://blog.csdn.net/q1056843325/article/details/5310610...

  • 前端基础查漏补缺(四):作用域与作用域链

    词法环境(Lexical Environments) 官方规范对词法环境的说明是:词法环境(Lexical Env...

  • 词法作用域

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

网友评论

      本文标题:词法欺骗

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