#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)}")