Перейти к содержанию

Почему нельзя использовать eval

Функция eval выполняет строку кода JavaScript в локальной области видимости.

var foo = 1
function test() {
  var foo = 2
  eval('foo = 3')
  return foo
}
test() // 3
foo // 1

Но eval исполняется в локальной области видимости только тогда, когда он вызывается напрямую и при этом имя вызываемой функции именно eval.

var foo = 1
function test() {
  var foo = 2
  var bar = eval
  bar('foo = 3')
  return foo
}
test() // 2
foo // 3

Любой ценой избегайте использования функции eval. 99.9% случаев её "использования" могут достигаться без её участия.

eval под прикрытием

Обе функции работы с интервалами времени setTimeout и setInterval могут принимать строку в качестве первого аргумента. Эта строка всегда будет выполняться в глобальной области видимости, поскольку eval в этом случае вызывается не напрямую.

Проблемы с безопасностью

Кроме всего прочего, функция eval — это проблема в безопасности, поскольку исполняется любой переданный в неё код; никогда не следует использовать её со строками из неизвестных или недоверенных источников.

Заключение

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