eval函数是一种强大且易于动态生成代码的方法,那么有哪些需要注意的地方呢?
eval函数是一种强大且易于动态生成代码的方法,那么有哪些需要注意的地方呢?
除了执行用户提交的代码可能存在安全问题之外,大多数情况下都有更好的方法,不需要每次执行时重新解析代码。匿名函数或对象属性可以替代大多数使用eval的情况,并且更加安全和快速。
eval()
并不重要。所有现代浏览器都有开发者控制台,您可以在其中执行任意javascript代码,任何半聪明的开发人员都可以查看您的JS源代码,并将所需的部分放入控制台以执行他们想要的操作。eval()
,答案是NO,除非您列出可能传递给eval语句的任何值。//Place this in a common/global JS lib:
var NS = function(namespace){
var namespaceParts = String(namespace).split(".");
var namespaceToTest = "";
for(var i = 0; i < namespaceParts.length; i++){
if(i === 0){
namespaceToTest = namespaceParts[i];
}
else{
namespaceToTest = namespaceToTest + "." + namespaceParts[i];
}
if(eval('typeof ' + namespaceToTest) === "undefined"){
eval(namespaceToTest + ' = {}');
}
}
return eval(namespace);
}
//Then, use this in your class definition libs:
NS('Root.Namespace').Class = function(settings){
//Class constructor code here
}
//some generic method:
Root.Namespace.Class.prototype.Method = function(args){
//Code goes here
//this.MyOtherMethod("foo")); // => "foo"
return true;
}
//Then, in your applications, use this to instantiate an instance of your class:
var anInstanceOfClass = new Root.Namespace.Class(settings);
编辑:顺便说一下,出于所有之前指出的安全原因,我不建议您以用户输入为基础来命名对象。虽然我无法想象您希望这样做的任何好理由,但我还是想指出这不是一个好主意 :)
namespaceToTest[namespaceParts[i]]
实现,这里不需要使用 eval。因此,只有在 typeof namespaceToTest[namespaceParts[i]] === 'undefined'
时才需要 namespaceToTest[namespaceParts[i]] = {};
,而在 else
分支中的唯一区别是 namespaceToTest = namespaceToTest[namespaceParts[i]];
。 - user2144406