Подтвердить что ты не робот

Почему существует eval()?

Многие программисты говорят, что это Плохая практика использования функции eval():

Когда JavaScript eval() не злой?

Я хотел бы сделать минутку, чтобы ответить на предпосылку вашего вопроса - что eval() является "злым"...

Является ли это eval() опасным?

Исправленный код Buggy может нарушать свойства безопасности так же легко, как исходный код ошибки...

Почему бы не eval() JSON?

Существует несколько способов защиты вашей безопасности...

Есть ли веская причина использовать eval()?

Да - когда нет другого способа выполнить задание с разумным уровнем ясности... Это устраняет 99% случаев, когда используется eval...

Почему eval небезопасно в javascript?

Опасность eval только возвращает свою уродливую голову, когда вы обслуживаете script, написанную alice для пользователя bob для браузера bob для eval...


Итак, почему он существует в первую очередь?

4b9b3361

Ответ 1

Потому что иногда есть необходимость. Все те же причины для использования eval в JavaScript могут, вероятно, использоваться совместно с использованием отражения в Java.

Однако я согласен со всем, что вы цитировали в своем вопросе. Многие причины для его использования не рекомендуется, и лучше всего по-другому, но иногда все еще есть необходимость или просто "лучший выбор" по сравнению с другими доступными альтернативами. (Я бы остановился на ответах на Есть ли веская причина использовать eval()? по дополнительным причинам.)

+1 к вашему вопросу для хорошего исследования.

Ответ 2

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

Языки без функции eval() могут определенно предоставить (подмножество? все?) этой функции, попросив каждого программиста по существу написать собственный eval() - lex вход, проанализировать ввод, создать новые объекты по мере необходимости, запускать методы или функции с помощью простых сравнений строк или аналогичных. По существу, дублируйте весь интерпретатор, который уже существует и отлаживается и быстро.

Ответ 3

Eval на самом деле является мощной функцией, и есть что-то, что невозможно обойтись без него. Например:

  • Вычислить код, полученный с удаленного сервера. (Скажите, что вы хотите создать сайт, который можно удаленно контролировать, отправив ему код JavaScript?)
  • Оценка пользовательского кода. Без eval вы не можете программировать, например, онлайн-редактор/REPL.
  • Динамическое создание функций произвольной длины (function.length - только для чтения, поэтому единственный способ - использовать eval).
  • Загрузка script и возврат значения. Если ваш script является, например, функцией самозапуска, и вы хотите оценить его и получить его результат (например: my_result = get_script_result("foo.js")), единственный способ программирования функции get_script_result - использовать eval внутри него.
  • Повторное создание функции в другом закрытии.

И все, что вы хотите сделать, это создание кода "на лету".

Причина, по которой она считается "злой", состоит в том, что она классически используется новичками, чтобы делать то, что язык может обрабатывать изначально. Например, код ниже:

age_of_erick = 34;
age_of_john = 21;
person = "erick";
eval("console.log('age_of_"+person+"')");

И код ниже:

age = {erick:34, john:21};
person = "erick";
console.log(age["erick"]);

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

Ответ 4

Там есть научно-исследовательская публикация по этой теме:

Eval Что люди делают - крупномасштабное исследование использования Eval в приложениях JavaScript
Зеркало на пути назад

Это самый полный ответ на этот вопрос на сегодняшний день.

Цитата из тезисов:

Мы записали поведение 337 МБ строк, указанных как аргументы до 550 358 вызовов функции eval, выполняемой в 10 000 веб-сайтов.

Кроме того, они идентифицировали 9 категорий повторяющихся Eval:

  • JSON - строка или вариант JSON.
  • JSONP - дополненная строка JSON.
  • Библиотека. Один или несколько функций.
  • Чтение - чтение доступа к объектов.
  • Назначить - присвоение локальной переменной или свойство объекта.
  • Типовое выражение Type Type.
  • Попробуйте - Trivial try/catch block.
  • Вызов - простой вызов функции/метода.
  • Пусто - Пустая или пустая строка.

Отрывок из заключения (который слишком длинный, чтобы его можно было процитировать):

[...] Хотя многие используют Eval, являются законными, многие из них не нужны и может быть заменен эквивалентным и безопасным кодом. Мы начали эту работу с надеждой, что он покажет, что Eval можно заменить другим функции. К сожалению, наши данные не подтверждают этот вывод. [...]

Хорошо стоит бумага.

Ответ 5

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

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

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

Ответ 6

Eval существует для упрощения задач в JavaScript. Вы можете использовать его для вычисления нескольких операторов. Вместо того, чтобы искать другой способ, вы можете использовать eval, чтобы делать такие вещи. Несмотря на то, что он обескуражен, он обладает значительной властью и пользой.