Может ли eval() оптимизировать?

Это способность eval() изменять локальные переменные, которые так проблематичны для оптимизаторов JavaScript.

Я прочитал книгу "Полное руководство".

eval() может оптимизировать? Я не понимаю.

Ответ 1

Это не то, что 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, эффективно заставляя его отключать его.