new Function() в JavaScript
- Что такое new Function()
- Синтаксис
- Параметры функции
- Функция из строки
- Область видимости
- Когда может встретиться
- Почему используют редко
- Итого
new Function() - это способ создать функцию из строки.
let sum = new Function('a', 'b', 'return a + b');
console.log(sum(2, 3));
Результат:
5
Первые строки ‘a’ и ‘b’ стали параметрами функции. Последняя строка стала телом функции.
Что такое new Function()
Обычно функции создают через Function Declaration, Function Expression или стрелочную функцию.
function sum(a, b) {
return a + b;
}
new Function() работает иначе. Он получает код в виде строки и создает из него функцию.
let sum = new Function('a', 'b', 'return a + b');
После создания такую функцию можно вызывать как обычную.
console.log(sum(10, 20));
Результат:
30
Синтаксис
Общий синтаксис выглядит так:
let functionName = new Function('parameter1', 'parameter2', 'function body');
Последний аргумент всегда считается телом функции.
Все аргументы до него становятся параметрами.
let sayHello = new Function('name', "return 'Привет, ' + name + '!'");
console.log(sayHello('Анна'));
Результат:
Привет, Анна!
Параметры функции
Параметров может быть сколько угодно.
let getFullName = new Function(
'firstName',
'lastName',
'return firstName + " " + lastName'
);
console.log(getFullName('Анна', 'Иванова'));
Результат:
Анна Иванова
Можно создать функцию и без параметров.
let getRandomNumber = new Function('return Math.random()');
console.log(getRandomNumber());
В этом случае единственная строка становится телом функции.
Функция из строки
Главная особенность new Function() в том, что код функции хранится в строке.
let code = 'return price - price * discount';
let getPrice = new Function('price', 'discount', code);
console.log(getPrice(1000, 0.1));
Результат:
900
Это может выглядеть гибко, но у такого подхода есть серьезные ограничения.
Область видимости
Функция, созданная через new Function(), не видит локальные переменные того места, где была создана.
function createFunction() {
let message = 'Привет';
return new Function('console.log(message)');
}
let showMessage = createFunction();
showMessage();
Такой код вызовет ошибку, потому что message находится в локальной области видимости функции createFunction().
new Function() работает с глобальной областью видимости.
let message = 'Привет';
let showMessage = new Function('console.log(message)');
showMessage();
Результат:
Привет
Когда может встретиться
new Function() может встретиться в коде, где нужно создать функцию динамически.
Например, когда строка с формулой приходит из настроек или собирается программой.
let formula = 'return a * b + 10';
let calculate = new Function('a', 'b', formula);
console.log(calculate(5, 3));
Результат:
25
Но в обычной разработке такие задачи встречаются редко.
Почему используют редко
new Function() выполняет строку как JavaScript-код.
Если такая строка пришла от пользователя или из ненадежного источника, это может быть опасно.
let userCode = 'console.log("код из строки")';
let run = new Function(userCode);
run();
Поэтому new Function() не стоит использовать для обработки пользовательского ввода.
В большинстве случаев обычная функция будет проще, понятнее и безопаснее.
function calculate(a, b) {
return a * b + 10;
}
Итого
1. new Function() создает функцию из строки.
2. Последний аргумент становится телом функции.
3. Все аргументы до последнего становятся параметрами.
4. Такая функция не видит локальные переменные места, где была создана.
5. new Function() используют редко, потому что код из строки сложнее контролировать и безопасно выполнять.