码迷,mamicode.com
首页 > 编程语言 > 详细

Javascript eval()函数的词法欺骗

时间:2019-02-15 17:38:47      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:foo   ons   fonts   外部   声明   pre   欺骗   参数   词法   

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()函数的词法欺骗

标签:foo   ons   fonts   外部   声明   pre   欺骗   参数   词法   

原文地址:https://www.cnblogs.com/codejoker/p/10384607.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!