执行没有eval的字符串或eval可以在这里使用吗?

时间:2011-07-28 20:55:24

标签: javascript eval

在这种情况下,有没有更好的方法来执行字符串“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)
    }
}

4 个答案:

答案 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语句来声明objectgetData,请在声明变量时使用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)

评估它是可以的。虽然我真的不明白你想要达到的目的。