Почему нельзя использовать 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
.