在这种情况下,有没有更好的方法来执行字符串“getData”而没有eval或eval是一个好的选项,因为正在评估的内容不是用户生成的?
object.myMainObject(Marcus)
object = {
Data = {
Marcus : function(){
alert('marcus function')
},
James : function(){
alert('james function')
}
}
myMainObject : function(string){
getData = "object.Data." + string + "()"
eval(getData)
}
}
答案 0 :(得分:4)
eval
完全没有必要,只需使用括号表示法来访问动态命名属性:
var object = {
Data : {
Marcus : function(){
alert('marcus function');
},
James : function(){
alert('james function');
}
}
myMainObject : function(string){
var getData = object.Data[string]();
}
};
object.myMainObject("Marcus"); // 'marcus function'
注意:
object
的方式存在一些语法错误(您使用的是=
,而不是:
)。var
语句来声明object
或getData
,请在声明变量时使用var
语句,否则,它们最终会作为全局对象的属性。作为一种安全措施,您可以在调用之前检查被访问的成员是否实际上是一个函数,例如:
//...
var getData;
if (typeof object.Data[string] == 'function') {
getData = object.Data[string]();
}
//...
答案 1 :(得分:2)
是的,还有更好的方法。使用square bracket notation按名称访问对象的属性:
object.Data[string]();
答案 2 :(得分:2)
评估它是不行的。
getData = object.Data[string]()
答案 3 :(得分:-1)
评估它是可以的。虽然我真的不明白你想要达到的目的。