JavaScript — Создание объекта функции из определения функции в строке

#javascript #string #function

Вопрос:

В JavaScript есть ли способ создать объект функции из определения функции в строке?

Что-то похожее на JSON.синтаксический анализ для создания JSON из строки.

 const parseFunction = (str)=> {
   // What should be implemented here?
   return func;
}
let funStr = parseFunction("function replacer(arg1) {console.log(arg1)}");
 

Комментарии:

1. Ты имеешь в виду eval ?

2. Зачем вам это нужно? Откуда берется определение функции?

3. Вы могли бы использовать конструктор функций? new Function(str) ? Вместо этого просто передайте тело функции

4. @феликс-клинг работает над конфигурацией панели мониторинга на основе шаблона JSON.. не удалось найти лучшего валидатора(линтов), который принимает функцию в качестве значения для ключа.. кроме того, наличие функции внутри JSON делает ее недопустимым JSON.. Я хочу сохранить функцию как значение, а также как допустимый JSON. Итак, просто ищу варианты

Ответ №1:

Использование eval влечет за собой множество рисков для безопасности в вашем приложении. У Javascript теперь есть альтернатива этому здесь

 const parseFunction = (str)=> {
   return Function('"use strict";return ('   str   ')')();
}
let funStr = parseFunction("function(arg1) {console.log(arg1)}");
 

Вы пытаетесь обойти это, это просто для справки.

Комментарии:

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

Ответ №2:

Просто импровизирую Mr.@abhishek-sharma ответ,

Функция, созданная с помощью Function('"use strict";return (' str ')')(); , не будет закрытием текущей области. В случае, если кто-то захочет получить доступ к какой-либо переменной в текущей области,

 const parseFunction = (str) => {
  return Function(
    'varNameInStr',
    'return function() {return ('   str   ')}',
  )(varInCurrScope)();
};
parseFunction("function(){console.log(varNameInStr)}")