Выполнение строки без eval или eval нормально здесь? - PullRequest
1 голос
/ 29 июля 2011

Есть ли лучший способ выполнения строки "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 ]

4 голосов
/ 29 июля 2011

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]();
    }
    //...
    
2 голосов
/ 29 июля 2011

Да, есть лучший способ.Используйте квадратную скобку для доступа к свойствам объекта по имени:

object.Data[string]();
2 голосов
/ 29 июля 2011

Оценивать это нехорошо.

getData = object.Data[string]()

0 голосов
/ 29 июля 2011

Это нормально, чтобы оценить это.Хотя я действительно не понимаю, чего вы пытаетесь достичь.

...