✅Синтаксис для объявления функции:
let func = new Function([arg1, arg2, ...argN], functionBody);Функция создаётся с заданными аргументами
arg1...argN и телом functionBody.Это проще понять на конкретном примере. Здесь объявлена функция с двумя аргументами:
let sum = new Function('a', 'b', 'return a + b');alert( sum(1, 2) ); // 3А вот функция без аргументов, в этом случае достаточно указать только тело:
let sayHi = new Function('alert("Hello")');sayHi(); // HelloГлавное отличие от других способов объявления функции, которые были рассмотрены ранее, заключается в том, что функция создаётся полностью «на лету» из строки, переданной во время выполнения.
Все предыдущие объявления требовали от нас, программистов, писать объявление функции в скрипте.
Но
new Function позволяет превратить любую строку в функцию. Например, можно получить новую функцию с сервера и затем выполнить её:let str = ... код, полученный с сервера динамически ...let func = new Function(str);func();Это используется в очень специфических случаях, например, когда мы получаем код с сервера для динамической компиляции функции из шаблона, в сложных веб-приложениях.
Обычно функция запоминает, где родилась, в специальном свойстве [[Environment]]. Это ссылка на лексическое окружение (Lexical Environment), в котором она создана.
Но когда функция создаётся с использованием new Function, в её [[Environment]] записывается ссылка не на внешнее лексическое окружение, в котором она была создана, а на глобальное. Поэтому такая функция имеет доступ только к глобальным переменным.
function getFunc() { let value = "test";let func = new Function('alert(value)');
return func;}getFunc()(); // ошибка: value не определено