«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Действительно ли `eval()` и `new Function()` взаимозаменяемы в JavaScript?

Действительно ли `eval()` и `new Function()` взаимозаменяемы в JavaScript?

Опубликовано 20 ноября 2024 г.
Просматривать:112

Are `eval()` and `new Function()` Truly Interchangeable in JavaScript?

Углубляясь в различия: взаимозаменяемы ли eval() и new Function() в JavaScript?

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

Рассмотрим следующие функции с одним оператором:

var evaluate = function(string) {
    return eval('('   string   ')');
}

var func = function(string) {
    return (new Function( 'return ('   string   ')' )());
}

console.log(evaluate('2   1'));
console.log(func('2   1'));

Эти две функции идентичны в своих операциях? Вопреки распространенному мнению, это не так.

eval() против new Function()

  • eval(): Интерпретирует строка как выражение JavaScript в текущей области выполнения. Он обладает возможностью доступа к локальным переменным.
  • new Function(): создает объект функции из строки, содержащей код JavaScript. Эта функция выполняется в отдельной области, изолируя ее от локальных переменных.

Чтобы проиллюстрировать эту разницу, рассмотрим следующую функцию:

function test1() {
    var a = 11;
    eval('(a = 22)');
    alert(a);            // alerts 22
}

В этом примере eval() изменяет локальную переменную 'a' внутри функции test1(), в результате чего выдается предупреждение 22. Однако, если бы мы использовали new Function('return (a = 22);')(), локальная переменная 'a' останется неизменной.

Последствия и предостережения

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

В результате обычно рекомендуется избегать использования eval() без крайней необходимости. Ненадежные данные, передаваемые в eval(), могут поставить под угрозу безопасность вашего приложения. Аналогично, new Function() следует использовать с осторожностью при обработке ненадежных входных данных.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3