Какова цель eval в JavaScript?

Возможный дубликат:
Когда eval () в JavaScript не является злом?

Я знаю, вообще использую eval() это плохая практика.

Но для чего он там существует?

Какова правильная цель eval()?

В какой ситуации лучше использовать eval()?

5 ответов

Решение

Eval

Оценивает строку кода JavaScript без ссылки на конкретный объект.

Если вы создаете арифметическое выражение в виде строки, вы можете использовать eval для его оценки в более позднее время. Например, предположим, что у вас есть переменная x. Вы можете отложить оценку выражения с участием x, назначив строковое значение выражения, скажем "3 * x + 2", переменной, а затем вызвав eval на более позднем этапе вашего сценария.

Будьте осторожны при использовании eval

eval() - опасная функция, которая выполняет код, который передается с привилегиями вызывающей стороны. Если вы запустите eval() со строкой, на которую может повлиять злоумышленник, вы можете в конечном итоге запустить вредоносный код на компьютере пользователя с разрешениями вашей веб-страницы / расширения.

eval() обеспечивает доступ к компилятору JavaScript, что в конечном итоге позволяет выполнять код позднее. Аргументы, переданные функции, передаются компилятору JavaScript, после чего выполняется код.

Разработчики спорят о безопасности eval(), Он менее безопасен, но если вы абсолютно уверены, что ваш вход очищен перед его передачей, тогда это не должно быть проблемой.

Кроме того, результаты eval() обычно медленнее, потому что код еще не скомпилирован и не кэширован. Очевидно, что использование функции будет значительно ухудшено.

Также сложно отлаживать код, полученный в результате использования eval() потому что практически нет контекстной информации (подумайте о номерах строк) о коде, который в конечном итоге выполняется.

С точки зрения веб-разработки, одно из самых популярных в настоящее время eval() заключается в десериализации строки JSON обычно в контексте приложений Ajax; однако это не означает, что не так много других применений.

Возможно, вы захотите проверить эту статью, ниже приведена прямая цитата со страницы, которая обобщает возможности eval.

Команда JavaScript EVAL может быть очень мощной при использовании динамического контента в веб-приложениях. EVAL может уменьшить код и облегчить взаимодействие с данными, которые неизвестны во время загрузки, но есть недостатки, которые необходимо учитывать.

Реальная сила этой команды - ее способность работать с данными, которые не известны во время загрузки, например, введенные пользователем данные. Как я уже упоминал, EVAL берет любую предоставленную вами строку и выполняет ее, возвращая результат, если он применим. Вы можете использовать это для выполнения JavaScript, когда то, что вас просят выполнить, неизвестно во время загрузки. Например, если у нас есть сценарий расчета, который принимает уравнение, предоставленное пользователем, и возвращает результат, вы можете использовать EVAL для выполнения расчета.

Я не думаю, что это так плохо - использовать это как опасное. Люди говорят, не использовать eval потому что это открывает лазейки для злоупотреблений. Можно использовать его, если ваш ввод в безопасности. Например, он используется в анализаторе JSON Дуга Крокфорда после проверки входных данных с помощью регулярного выражения, чтобы убедиться в отсутствии "опасного" содержимого.

Другая причина, по которой люди говорят вам не использовать его, заключается в том, что если вы используете eval слишком часто, люди начнут называть вас Eval Knievel.

Я недавно экспериментировал с eval() команда, пытаясь придумать новое соглашение для нового проекта.

Что я хотел, так это: мне понравилась идея иметь частные, публичные и привилегированные методы, ала. Статья Дуга Крокфорда, но я хотел иметь возможность выставлять открытые методы / переменные вверху моих классов, а не внизу, как обычно.

Учти это:

var Singleton = function() {
    // Private
    function _one() {
        // code...
    }

    function _two() {
        // code...
    }

    // Public
    return {
        one: _one,
        two: _two
    };
}();

С тремя eval()'s (два вложенных в основной) я смог иметь этот синтаксис:

var Singleton = function() {
    // Public
    var $interface = {
        one: $forward,
        two: $forward
    };

    // Private
    function _one() {
        // code...
    }

    function _two() {
        // code...
    }

    // This does the magic
    return eval($init);
}('Singleton');

И вопреки всему и здравому смыслу это сработало. (Обратите внимание, что я также хотел отладить мои пространства имен, поэтому вы можете увидеть строку, переданную в синглтон. $init позаботился об этом тоже.)

Во всяком случае, я предполагаю, что смысл всего этого - сказать, что eval() это не обязательно нездоровый след мусора JavaScript, которого следует избегать любой ценой, и его можно использовать не только для (доверенного!) кода, отправленного с сервера, и десериализации JSON.

(Хотя в моем случае это закончилось умственной тренировкой, так как с тех пор я убедил себя не беспокоиться о приватных методах / переменных в конце концов и просто использовать строгое соглашение о пространстве имен.)

Другие вопросы по тегам