调用eval函数会将其参数作为JavaScript程序进行解释。但是该程序运行于调用者的局部作用域中,嵌入到程序的全局变量会被创建为调用程序的局部变量。
function test(x) {
eval("var y = x;");
return y;
}
test("hello"); // "hello"
当条件语句被执行时,放置在该条件语句中的eval函数才会将其变量加入到作用域中。
var y = "global";
function test(x) {
if(x) {
eval("var y = 'local';");
}
return y;
}
基于作用域决定程序的动态行为通常是个坏主意。
var y = "global";
function test(src) {
eval(src);
return y;
}
test("var y = 'local';"); // "local"
test("var z = 'local';"); // "global"
上述代码赋予了外部调用者能改变test函数内部作用域的能力,很不安全也很脆弱。保证eval函数不影响外部作用域的一个简单方法是在一个明确的嵌套作用域中运行它。
var y = "global";
function test(src) {
(function() {
eval(src);
})()
}
test("var y = 'local';"); // "global"
test("var z = 'local';"); // "global"
提示
- 避免使用eval函数创建的变量污染调用者的作用域。
- 如果eval函数代码可能创建全局变量,将此调用封装到嵌套的函数中以防止作用域污染