我正在编写一些JavaScript代码来解析用户输入的函数(用于类似电子表格的功能).解析了公式后,我可以将其转换为JavaScript并eval()在其上运行以产生结果.
但是,eval()如果我可以避免它,我总是回避使用,因为它是邪恶的(而且,无论是对还是错,我一直认为它在JavaScript中更加邪恶,因为要评估的代码可能会被用户改变).
那么,什么时候可以使用它?
我知道Lisp和Scheme程序员通常会说eval除非必要,否则应该避免.我已经看到了几种编程语言的相同建议,但我还没有看到一个反对使用的明确论据列表eval.我在哪里可以找到使用中潜在问题的说明eval?
例如,我知道GOTO程序编程中的问题(使程序难以理解且难以维护,难以找到安全问题等),但我从未见过反对的论点eval.
有趣的GOTO是,相反的论点应该对延续有效,但我看到Schemers,例如,不会说延续是"邪恶的" - 你在使用时应该小心.他们更倾向于使用代码而eval不是代码使用continuation(据我所知 - 我可能是错的).
许多程序员说使用该功能是一种不好的做法eval():
我想花一点时间来解决你的问题的前提 - eval()是"邪恶的"......
Buggy evaled代码可能违反安全属性,就像有缺陷的源代码一样容易...
您的安全性可能有多种方式可能会受到影响......
是的 - 当没有其他方法以合理的清晰度完成给定任务时...这消除了99%使用eval的情况......
eval的危险只会在你为一个用户bob写的脚本服务bob的浏览器eval时提供它丑陋的头部...
那为什么它首先存在?
在我看来,eval()同样不屑于goto.而且eval,我指的是一个用于执行字符串作为代码的函数,如PHP,Python,JavaScript等所示.是否存在使用eval()合理的情况(perl除外)?如果没有,为什么这么多语言实现它呢?
我使用以下代码每5秒调用一次jQuery插件
var now = new Date();
setInterval('$("#id").myplugin(now)', 1000);
Run Code Online (Sandbox Code Playgroud)
到目前为止,插件看起来像这样:
(function( $ ){
$.fn.myplugin = function(now) {
return this.each(function() {
alert(now.getTime());
});
}
})( jQuery );
Run Code Online (Sandbox Code Playgroud)
但是我得到错误:
未捕获的ReferenceError:现在未定义
plugins.js:30未捕获的TypeError:无法调用未定义的方法'getTime'
所以它看起来好像现在的时间对象doenst被传递给插件函数,甚至没有在setInterval方法中定义.我可以调用var now = new Date(); 每次都在插件函数中...但我想知道,为什么它会像这样工作以及如何使它工作;).多谢.
eval ×4
javascript ×3
clojure ×1
coding-style ×1
common-lisp ×1
lisp ×1
scheme ×1
setinterval ×1