Eval - это проблема зла - PullRequest
       9

Eval - это проблема зла

4 голосов
/ 21 октября 2010

Использование JSlint для проверки моего JavaScript.

Я получаю сообщение о том, что eval - это зло! Почему это и есть ли альтернатива, которую я могу использовать?

Вот пример того, где я использую eval и хотел бы обойти это.

У меня есть такой массив:

var Resources = {
message_1: 'Message 1',
message_2: 'Message 2',
message_3: 'Message 3',
message_4: 'Message 4'
};

У меня есть функция (functionResult), которая возвращает число, 1, 2, 3 или 4. Поэтому в следующей строке кода я хочу получить Resource в массиве, в котором сообщение заканчивается в результате моей функции.

$('#divPresenter').html(eval($.validator.format('Resources.message_{0}', functionResult)));

Есть идеи, как я могу удалить eval и заменить чем-то другим?

Ответы [ 6 ]

9 голосов
/ 25 октября 2010

Вместо:

eval($.validator.format('Resources.message_{0}', functionResult))

просто используйте:

Resources["message_" + functionResult]

Все объекты в JavaScript - это действительно ассоциативные массивы (или хэши), а синтаксис точки (a.b)просто синтаксический сахар для поиска чего-либо в хэше (a['b']).Так что вам вообще не нужно eval;просто создайте ключ как строку и найдите его значение, используя этот ключ.

8 голосов
/ 21 октября 2010

http://blogs.msdn.com/b/ericlippert/archive/2003/11/01/53329.aspx

В большинстве случаев используется eval как кувалда, ударяющая муху - он выполняет свою работу, но слишком большая сила Это медленно, это громоздко, и имеет тенденцию увеличивать урон, когда Вы делаете ошибку.

5 голосов
/ 21 октября 2010

Это зло, потому что позволяет вам выполнить строку как код, и кто знает, откуда эта строка пришла или что она содержит.

И да, в 99,9% случаев есть лучшие альтернативы (что именноэто зависит от того, для чего вы используете eval).Оставшиеся 0,1% времени у вас действительно нет другого выбора, кроме как использовать eval, и в таких случаях вам нужно быть предельно осторожным.

3 голосов
/ 21 октября 2010

Если вы пытаетесь использовать eval для преобразования строк в объекты JSON, возможно, попробуйте JSON-анализатор lib (я никогда не использовал его, но это выглядит разумно).

3 голосов
/ 21 октября 2010

JS Lint включает в себя то, что Дуглас Крокфорд считает лучшими практиками для JavaScript. Одной из функций, которые он настоятельно рекомендует использовать, является eval. Я полагаю, что он считает это медленным и небезопасным.

Там может быть много потенциальных альтернатив, в зависимости от рассматриваемого кода. Если вы хотите опубликовать раздел своего кода, в котором используется eval, мы можем дать более конкретный совет.

2 голосов
/ 25 октября 2010

Мне не совсем понятно, что вы делаете, но похоже, что
$('#divPresenter').html(eval($.validator.format('Resources.message_{0}', functionResult)));
можно записать как
$('#divPresenter').html(Resources["message_" + functionResult]);

...