Различие Eval () и New Function () в JavaScript
в JavaScript, разработчики часто сталкиваются с двумя функциями, которые, по -видимому, выполняют аналогичную задачу: eval () и new Function (). В то время как обе функции оценивают строки как код, их базовые механизмы и последствия значительно различаются.
eval () против New Function ()
функция eval () оценивает строку как выражение Javascript в рамках текущего исполнения. Это означает, что он имеет доступ к локальным переменным, определенным в текущей области. Напротив, New Function () анализирует код JavaScript, хранящийся в строке в объекте функции, который затем можно вызвать. Этот объект функции создается в отдельной области и, следовательно, не может получить доступ к локальным переменным призванной среды. return eval ('(' string ')'); } var func = function (string) { return (new Function ('return (' string ')') ()); } console.log (evaluate ('2 1')); console.log (func ('2 1'));
] обе функции выведут ожидаемый результат 3. Однако, если мы изменем код для использования локальных переменных, разница становится очевидной: test1 () { var a = 11; eval ('(a = 22)'); // изменяет локальную переменную в функции `test1` предупреждение (а); // оповещения 22 }
В этом случае с использованием eval () изменит локальную переменную A, потому что оценка происходит в области функции Test1. Однако, если бы мы использовали новую функцию ('return (a = 22);') () вместо этого локальная переменная A останется незатронутой, потому что код работает в отдельной области. Злоусовечник может потенциально обнародовать конфиденциальную информацию или выполнять произвольный код. Следовательно, настоятельно рекомендуется избегать использования этих функций, если это не абсолютно необходимо.
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'));Заключение
function test1() { var a = 11; eval('(a = 22)'); // Modifies the local variable within the `test1` function alert(a); // Alerts 22 }
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3