【问题标题】:How to eval variables into local scope object's properties instead of global scope in JavaScript如何将变量评估为局部范围对象的属性而不是 JavaScript 中的全局范围
【发布时间】:2015-07-04 14:51:13
【问题描述】:

我有一些从服务器返回的代码,比如“var myVar = 314;”,我想创建一个上下文对象,比如 var context = {};然后评估脚本“var myVar = 314;”进入上下文的属性,我怎么能做到这一点?

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

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

编辑 可能是我一开始不够清楚,我预期的结果是:在eval()之后,我得到了上下文对象中的属性,目的是避免全局范围的人口。

例如,

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

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

【问题讨论】:

  • 试试context["myVar"] = 314;?
  • 变量不进入对象。不确定你实际上在问什么。你想得到什么结果?
  • 即使你使用抽象来实现this,你也是varing,所以不会在this对象上设置值,只是在你调用@的闭包中987654329@下。
  • 我相信this extensible Scope class 与您正在寻找的内容很接近。它允许您添加私有变量并使用其 eval 方法来评估使用它们的代码。它还会跟踪您添加的 var 名称。

标签: javascript scope eval global


【解决方案1】:

您能否更改从服务器获取的脚本的格式?如果是这样,请遵循 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" }

这种方法可以很容易地适用于多个变量、其他数据类型等。

【讨论】:

  • 谢谢你,你的方法很有魅力。我认为我能够限制 eval() 的范围,以便像 var someVal 这样的声明会像全局范围一样进入这个范围。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 2017-03-05
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
相关资源
最近更新 更多