【发布时间】:2011-06-14 06:55:39
【问题描述】:
作为模板引擎的一部分,我需要能够评估 JavaScript 中的表达式,例如:
"first || second" 在全局命名空间的某些对象服务角色的上下文中。所以对象的属性应该被视为全局变量。
到目前为止,我想出了这个功能:
function scopedEval(str, scope) {
var f = new Function("scope", "with(scope) { return (" + str + "); }");
return f(scope);
}
一切都很好,我可以运行它:
var scope = { first:1, second:2 };
var expr1 = "first || second";
alert( scopedEval(expr1,scope) );
它提醒我1。
没有在范围对象中定义的变量的唯一问题。这个:
var expr2 = "third || first || second";
alert( scopedEval(expr2,scope) );
生成错误“变量third 未定义”。但我希望将所有未知变量解析为undefined,而不是抛出错误。所以“第三||第一||第二”应该再次让给1。
据我所知,这样的事情在现代 JavaScript 中是不可能的,但我可能会错过一些这样的问题。有什么想法吗?
这里有一个例子:http://jsfiddle.net/nCCgT/
【问题讨论】:
-
jade做了类似的事情,但内置了一个完整的编译器。是的,有可能,构建一个编译器。 -
哇:
eval和with合二为一!母校! -
@Koolinc:它缺少
break <label>(~ goto)... -
@Ates:为了完整起见,它还应该使用
document.write将<marquee>元素写入页面,并使用window.open等创建一些弹出窗口等。有时Web 开发真的是sisyphean (en.wikipedia.org/wiki/Sisyphus) -
你可以使用 eval 和词法作用域来做这样的事情。我在回答中提供了一个 Scope 类,here
标签: javascript scope eval