eval函数是一种动态生成代码的强大而简单的方法,那么有什么警告呢?
我正在编写一些JavaScript代码来解析用户输入的函数(用于类似电子表格的功能).解析了公式后,我可以将其转换为JavaScript并eval()在其上运行以产生结果.
但是,eval()如果我可以避免它,我总是回避使用,因为它是邪恶的(而且,无论是对还是错,我一直认为它在JavaScript中更加邪恶,因为要评估的代码可能会被用户改变).
那么,什么时候可以使用它?
我知道Lisp和Scheme程序员通常会说eval除非必要,否则应该避免.我已经看到了几种编程语言的相同建议,但我还没有看到一个反对使用的明确论据列表eval.我在哪里可以找到使用中潜在问题的说明eval?
例如,我知道GOTO程序编程中的问题(使程序难以理解且难以维护,难以找到安全问题等),但我从未见过反对的论点eval.
有趣的GOTO是,相反的论点应该对延续有效,但我看到Schemers,例如,不会说延续是"邪恶的" - 你在使用时应该小心.他们更倾向于使用代码而eval不是代码使用continuation(据我所知 - 我可能是错的).
我有一些在客户端(浏览器)和服务器上运行的JavaScript函数(在Java Rhino上下文中).这些是小函数 - 基本上很少有验证器,它们定义良好且不依赖于全局或闭包 - 自包含和可移植.
这是一个例子:
function validPhoneFormat(fullObject, value, params, property) {
var phonePattern = /^\+?([0-9\- \(\)])*$/;
if (value && value.length && !phonePattern.test(value))
return [ {"policyRequirement": "VALID_PHONE_FORMAT"}];
else
return [];
}
Run Code Online (Sandbox Code Playgroud)
为了保持DRY,我的服务器代码获取每个函数的句柄并调用它们上的toString(),将它们作为JSON对象的一部分返回给浏览器.像这样的东西:
{ "name" : "phoneNumber",
"policies" : [
{ "policyFunction" : "\nfunction validPhoneFormat(fullObject, value, params, property) {\n var phonePattern = /^\\+?([0-9\\- \\(\\)])*$/;\n if (value && value.length && !phonePattern.test(value)) {\n return [{\"policyRequirement\":\"VALID_PHONE_FORMAT\"}];\n } else {\n return [];\n }\n}\n"
}
]
}
Run Code Online (Sandbox Code Playgroud)
然后我的浏览器JS代码接受此响应,并在该上下文中创建此函数的实例,如下所示:
eval("var policyFunction = " + this.policies[j].policyFunction);
policyFailures …Run Code Online (Sandbox Code Playgroud) 所以我正在寻找类似于这个问题python if语句的变量数学运算符,但在jQuery/Javascript中
基本上是这样的
var one = "4";
var two = "6";
var op = "==";
if (one op two) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
eval ×4
javascript ×4
clojure ×1
coding-style ×1
common-lisp ×1
dry ×1
jquery ×1
jslint ×1
lisp ×1
scheme ×1
security ×1