2010-08-11 1 views
3

У меня есть сценарий приложения, который работает правильно, но у меня есть несколько операторов eval(), чтобы заставить все работать. Я не понимаю, почему «eval is evil», поскольку я продолжаю читать, но я действительно не понимаю, как избежать использования, когда это единственное, что делает то, что мне нужно.Вопрос об eval() в javascript ... почему это зло и как я могу выполнить одно и то же, не используя его?

В моем сценарии у меня есть куча продуктов. Каждый продукт имеет свой собственный массив свойств. Также имеется массив всех имен массивов. Когда я запускаю различные функции, эти массивы используются для создания содержимого страницы. Единственный метод, который я нашел, что работы были сделать это:

var schedule = {}; 
$.each(productNameArray, function (i, name) { 
    schedule = eval(name); 
    // DO STUFF 
}); 

Просто используя имя передает строку и не читает фактический массив он предназначается для ссылки. Eval заставляет его работать как объект.

Итак, как сделать это без использования Eval()?

+0

Вы могли бы написать пример для содержимого «name» –

ответ

1

Что вы делаете, это разбор строки JSON (например). Это один из немногих случаев, когда eval фактически не evil.

Если вы можете доверять серверу 100%, из которых данные поступают на клиенте, это не проблема вообще (речь о вопросах безопасности с Eval).

Если это не так, вы всегда должны избегать использования eval(), поскольку любой код, который оценивается имеет доступ к вашей global window object, cookies, DOM и т.д., и использоваться для шпионажа & передачи данных вокруг.

Вторая большая тема о том, почему Eval зло является производительность. eval() медленный, когда дело доходит до фактического интерпретации кода ECMAscript.Вот, например, с помощью setTimeout как

setTimeout("myfunction();", 2000); // don't do that 

это всегда должно быть написано, как

setTimeout(myfunction, 2000); 

Letting Javascript синтаксический Javascript, имеет большое влияние на производительность.

+0

Одним из способов ответа на сервер может быть изменен путем изменения файла локальных хостов. Вы никогда не сможете доверять тому, что получаете. – balupton

+0

@balupton: Это звучит довольно надуманно. Если у кого-то есть доступ к вашему локальному компьютеру, он не попытается получить доступ к вашему браузеру javascript, а к вашему режиму ядра/Trojan/Whatever. – jAndy

+0

Я собираюсь придерживаться того, что у меня есть, так как это действительно работает, но я буду смотреть на использование более объектно-ориентированного подхода в следующий раз. Спасибо за ввод. –

1

Eval Зла.

Eval is evil, поскольку код eval'd не может быть оптимизирован с помощью javascript-интерпретаторов и мини-издателей, из-за чего может возникнуть довольно много проблем (возможно, интерпретатор или minifier понимает это неправильно или из-за преобразования заполняет eval'd). Другая сторона монеты состоит в том, что обычно 99% кода eval'd можно переписать, чтобы не использовать eval - для этого может потребоваться тонна мышления и решения проблем, но обычно это так.

Как избежать его использования.

Я действительно не понимаю, как избежать использования, когда это единственное, что делает то, что мне нужно.

Просто используя имя передает строку и не читает фактический массив он предназначается для ссылки. Eval заставляет его работать как объект.

Вы можете использовать объект для хранения переменных, которые вы хотите ссылаться, а затем использовать obj[name]. Однако без полного кода это просто спекуляция ... которая должна показаться подходящей.

+0

Я должен был построить объекты вместо использования массивов и строк в первую очередь. Мне придется переработать его в версии 2.0. Благодарю. –