Синтаксис для объявления функции:
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 не определено