Конструктор функций vs eval - PullRequest
0 голосов
/ 29 марта 2020

Я наткнулся на это на Документы MDN относительно Function

Конструктор Function создает новый объект Function. Прямой вызов конструктора может динамически создавать функции, но страдает от безопасности и подобных (но гораздо менее значительных) проблем с производительностью для оценки. Однако, в отличие от eval, конструктор Function создает функции, которые выполняются только в глобальной области видимости.

Может кто-нибудь объяснить мне, что такое конструктор функции и что такое eval? Или, другими словами, кто-то может объяснить мне вышеупомянутое утверждение заранее?

1 Ответ

1 голос
/ 29 марта 2020

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

  • new Function() имеет доступ только к глобальной области действия
  • eval() имеет доступ к локальной области действия

Примером будет такой:

  • Вы создаете функцию, скажем f, которая равна new Function('console.log(x)'), и затем вызываете ее. Независимо от того, какая область вызова f() вызывается, она всегда записывает значение x в глобальную область действия
  • У вас есть eval('console.log(x)'). Значение x зависит от области действия eval() в:

const x = 'global x';
const f = new Function('console.log(x)');

f(); // logs 'global x'
eval('console.log(x)'); // logs 'global x'

// Let's create a function scope
function test() {
  const x = 'local x';
  const f = new Function('console.log(x)');

  f(); // logs 'global x'
  eval('console.log(x)'); // logs 'local x';
}
test();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...