如何在JavaScript中将变量eval到本地范围对象的属性而不是全局范围

时间:2015-07-04 14:51:13

标签: javascript scope eval global

我有一些代码从服务器返回,比如“var myVar = 314;”,我想创建一个像var var = {}的上下文对象;然后评估脚本“var myVar = 314;”在上下文的属性中,我怎么能实现这个呢?

我尝试过以下代码,但没有成功:

var context = {};
eval.call(context, "var myVar = 314;");

修改 可能是我首先不够清楚,我预期的结果是:在eval()之后,我得到了上下文对象中的属性,目的是避免全局范围的填充。

例如,

var context = {};
eval.call(context, "var myVar = 314;");

我希望结果为context.myVar = 314。

1 个答案:

答案 0 :(得分:0)

您是否可以更改从服务器获取的脚本格式?如果是这样,请遵循Aadit评论中的建议,让服务器发送:

context["myVar"] = 314;

或:

context.myVar = 314;

如果您无法更改格式,那么脚本字面上就像var myVar = 314;一样简单吗?

如果是,请尝试重新思考方法。而不是在某个特定上下文中尝试eval()脚本,而是将脚本解析为可以使用的表单。例如:

var script = 'var myVar = -314.5;';  // what we get from the server
var match = script.match( /var\s+(\w+)\s*=\s*(-?[\d.]+)\s*;/ );
if( match ) {
    // match[1] is 'myVar', match[2] is '-314.5'
    context[ match[1] ] = +match[2];
}
console.log( context );

现在context{ myVar: -314.5 }。此代码可以在函数内部或任何地方运行,并且可以正常运行。

您可以对字符串变量赋值使用类似的正则表达式:

var script = 'var myString = "Test Value";';  // what we get from the server
var match = script.match( /var\s+(\w+)\s*=\s*"([^"]*)"\s*;/ );
if( match ) {
    // match[1] is 'myString', match[2] is 'Test Value'
    context[ match[1] ] = match[2];
}
console.log( context );

这一次,context{ myString: "Test Value" }

这种方法可以很容易地适应多种变量,其他数据类型等。