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()函数运行,有自己的词法作用域,无法修改所在的作用域。

 

posted on 2019-02-15 17:02  时光游弋  阅读(173)  评论(0编辑  收藏  举报