Search code examples
javascripteval

Executing a string without eval or is eval ok to use here?


Is there a better way of executing the string "getData" without eval or eval a good option in this case since what is being evaluated is not user generated?

object.myMainObject(Marcus)

object = {
    Data = {
        Marcus : function(){
            alert('marcus function')
        },
        James : function(){
            alert('james function')
        }
    }

    myMainObject : function(string){
        getData = "object.Data." + string + "()"

        eval(getData)
    }
}

Solution

  • eval is completely unnecessary for this case, just use the bracket notation to access the dynamically named property:

    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'
    

    Notes:

    • There were some syntax errors in the way you were defining object (you were using =, instead of : ).
    • You weren't using the var statement to declare object nor getData, please, when declaring variables, use the var statement, otherwise, they will end up as properties of the global object.
    • As a safety measure, you could check if the member that's being accessed is actually a function before calling it, e.g.:

      //...
      var getData;
      if (typeof object.Data[string] == 'function') {
         getData = object.Data[string]();
      }
      //...