Какова целевая цель eval в JavaScript?
Возможный дубликат:
Когда JavaScript & rsquo; s eval() не злой?
Я знаю, обычно использование eval()
- это плохая практика.
Но с какой целью он существует?
Какова правильная цель eval()
?
В какой ситуации лучше использовать eval()
?
Ответы
Ответ 1
eval
Вычисляет строку кода JavaScript без ссылки на конкретную объект.
Если вы построите арифметическое выражение как строку, вы можете использовать eval для его оценки позднее. Например, предположим, что у вас есть переменная x. Вы можете отложить оценку выражения с участием x, назначив строковое значение выражения, например "3 * x + 2", переменной, а затем вызовите eval в более поздней точке вашего script.
Будьте осторожны при использовании eval
eval() - опасная функция, которая выполняет переданный им код с привилегиями вызывающего. Если вы запустите eval() со строкой, на которую может повлиять злонамеренная сторона, вы можете запустить вредоносный код на компьютере пользователя с разрешениями вашей веб-страницы/расширения.
Ответ 2
eval()
предоставляет доступ к компилятору JavaScript, и это в конечном итоге позволяет выполнить код позднее. Аргументы, переданные функции, передаются компилятору JavaScript, после чего выполняется код.
Разработчики рассуждают о безопасности eval()
. Он менее безопасен, но если вы абсолютно уверены, что ваш вход очищен, прежде чем передавать его, то это не должно быть проблемой.
Кроме того, результаты eval()
обычно медленнее, потому что код еще не был скомпилирован и не кэширован. Очевидно, что для использования функции явно будет удар производительности.
Также сложно отлаживать код, который возникает из-за использования eval()
, потому что для кода, который в конечном итоге выполняется, имеется мало-по-никакой контекстной информации (номера мыслительных строк).
В терминах веб-разработки одним из самых популярных в настоящее время использованием eval()
является десериализация строки JSON, как правило, в контексте приложений Ajax; однако это не означает, что не так много других применений.
Ответ 3
Возможно, вы захотите проверить эту статью, ниже приведена прямая цитата страницы, которая суммирует силу eval.
Команда JavaScript EVAL может быть очень мощный при использовании динамических контента в веб-приложениях. EVAL может уменьшить код и облегчить взаимодействие с неизвестными данными во время загрузки, но есть недостатки принимать во внимание.
Действительной силой этой команды является ее способность работать с данными, которые не являются известных во время загрузки, например, введенные пользователем данные. Поскольку у меня есть упомянутый, EVAL принимает любую строку, которая вы предоставляете и выполняете его возврат результат, если он применим. Вы может использовать это для выполнения JavaScript где то, что вас просят выполнение не известно во время загрузки. Для пример, если у нас есть расчет script, который принимает заданное уравнение пользователем и возвращает результат, вы может использовать EVAL для выполнения расчет.
Ответ 4
Я не думаю, что это так плохо, чтобы использовать его как опасное. Люди говорят, что не используйте eval
, потому что он открывает лазейки для злоупотреблений. Это нормально использовать, если ваш вход безопасен. Он используется в Doug Crockford JSON parser, например, после того, как вход был проверен с использованием регулярного выражения, чтобы убедиться, что нет "опасных".
Другая причина, по которой люди говорят вам не использовать это, заключается в том, что если вы слишком сильно используете eval, люди начнут называть вас Eval Knievel.
Ответ 5
Недавно я экспериментировал с командой eval()
, пытаясь придумать новое соглашение для нового проекта.
То, что я хотел, было так: мне понравилась идея иметь частные, общедоступные и привилегированные методы, ala. статья Дуга Крокфорда, но я хотел, чтобы в публичных методах/переменных публиковать методы/переменные в верхней части моих классов, а не внизу, как обычно.
Рассмотрим это:
var Singleton = function() {
// Private
function _one() {
// code...
}
function _two() {
// code...
}
// Public
return {
one: _one,
two: _two
};
}();
С тремя eval()
(двумя вложенными внутри основного) я смог получить этот синтаксис:
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');
И против всех разногласий и здравого смысла это сработало. (Обратите внимание, что мне также нужен способ отладки моих пространств имен, поэтому вы можете увидеть строку, переданную в singleton. $init
тоже позаботился об этом.)
Во всяком случае, я предполагаю, что написание всего этого состоит в том, чтобы сказать, что eval()
не обязательно является болезненным рутином мусора JavaScript, которого следует избегать любой ценой, и его можно использовать по-разному, чем просто ( доверенный!) код, отправленный с сервера и де-сериализация JSON.
(Хотя в моем случае это закончилось как ментальная тренировка, поскольку я с тех пор убеждал себя не беспокоиться о частных методах/переменных в конце концов и просто использовать строгое соглашение об именах.)