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