Javascript eval()函数的词法欺骗

Posted 时光游弋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript eval()函数的词法欺骗相关的知识,希望对你有一定的参考价值。

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

上面代码运行结果为: 1,3

eval(..) 函数可以接受一个字符串为参数, 并将其中的内容视为好像在书eval(..) 函数可以接受一个字符串为参数, 并将其中的内容视为好像在书
写时就存在于程序中这个位置的代码。 换句话说, 可以在你写的代码中用程序生成代码并运行, 就好像代码是写在那个位置的一样。

eval(..) 调用中的 "var b = 3;" 这段代码会被当作本来就在那里一样来处理。 由于那段代码声明了一个新的变量 b, 因此它对已经存在的 foo(..) 的词法作用域进行了修改。 事实
上, 和前面提到的原理一样, 这段代码实际上在 foo(..) 内部创建了一个变量 b, 并遮蔽了外部(全局) 作用域中的同名变量。 

在严格模式下eval()函数运行,有自己的词法作用域,无法修改所在的作用域。

 







以上是关于Javascript eval()函数的词法欺骗的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript eval 和 with 函数

你不知道的JavaScript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法

你不知道的JavaScript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法

js 欺骗词法作用域

JavaScript中,为什么eval和with会有性能问题?

你不知道的JavaScript(上卷)