Если вы заметили использование eval () в своем коде, помните мантру «eval () - зло».
Это
Функция принимает произвольную строку и выполняет ее как код JavaScript. Когда код в
вопрос известен заранее (не определяется во время выполнения), нет смысла использовать
Eval ().
Если код генерируется динамически во время выполнения, часто есть лучший способ
достичь цели без eval ().
Например, просто используя квадратную скобку
доступ к динамическим свойствам стал лучше и проще:
// antipattern
var property = "name";
alert(eval("obj." + property));
// preferred
var property = "name";
alert(obj[property]);
Использование eval()
также имеет последствия для безопасности, потому что вы можете выполнять код (для
пример из сети), который был подделан.
Это распространенный антипаттерн при работе с JSON-ответом на Ajax-запрос.
В тех случаях
лучше использовать встроенные в браузер методы для анализа ответа JSON, чтобы сделать
уверен, что это безопасно и действительно. Для браузеров, которые не поддерживают JSON.parse()
изначально, вы можете
используйте библиотеку из JSON.org.
Также важно помнить, что передача строк в setInterval()
, setTimeout()
,
и конструктор Function()
, по большей части, похож на использование eval()
и поэтому
необходимо избегать.
За кулисами JavaScript все еще должен оценивать и выполнять
строка, которую вы передаете как программный код:
// antipatterns
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);
// preferred
setTimeout(myFunc, 1000);
setTimeout(function () {
myFunc(1, 2, 3);
}, 1000);
Использование нового конструктора Function () аналогично eval () и к нему следует обратиться
с осторожностью. Это может быть мощная конструкция, но часто используется неправильно.
Если вам абсолютно необходимо
используйте eval()
, вместо этого вы можете использовать new Function ().
Есть небольшой потенциал
выигрыш, потому что код, оцененный в новой функции (), будет работать в локальной функции
область видимости, поэтому любые переменные, определенные с помощью var в оцениваемом коде, не станут
глобалы автоматически.
Другой способ предотвратить автоматическую глобализацию - это обернуть
eval()
вызов немедленной функции.