Это способность eval() изменять локальные переменные, которые так проблематичны для оптимизаторов JavaScript.
Я прочитал книгу "Полное руководство".
eval() может оптимизировать? Я не понимаю.
Это способность eval() изменять локальные переменные, которые так проблематичны для оптимизаторов JavaScript.
Я прочитал книгу "Полное руководство".
eval() может оптимизировать? Я не понимаю.
Это не то, что eval
оптимизирует, это то, что JavaScript-движки, стремящиеся оптимизировать, не могут этого сделать с помощью eval
, поскольку он принимает строку, и они не могут выполнять статический анализ кода, который он может выполнить.
Рассмотрим эту функцию:
function foo(str) {
var a = getAReallyBigArray();
doSomethingWith(a);
document.getElementById("foo").addEventListener('click', function() {
alert(str);
}, false);
}
В соответствии со спецификацией функция обработчика событий ссылается на переменную a
(через объект привязки переменных для контекста выполнения), и поэтому массив хранится в памяти до тех пор, пока существует этот обработчик событий. Но механизм JavaScript может анализировать обработчик событий и определять, что он не может ссылаться на a
, и поэтому оптимизирует содержимое объекта привязки переменных и позволяет массиву собирать мусор.
Но бросьте eval
там:
function foo(str) {
var a = getAReallyBigArray();
doSomethingWith(a);
document.getElementById("foo").addEventListener('click', function() {
eval(str);
}, false);
}
Теперь для JavaScript-движка невозможно оптимизировать содержимое объекта привязки переменных, поэтому он должен хранить большой массив в памяти, если str
имеет в нем код, который обращается к нему.
Это только один конкретный пример. Основной момент состоит в том, что eval
бросает большой большой гаечный ключ в работу для оптимизатора движка JavaScript, эффективно заставляя его отключать его.