#javascript #typescript #babeljs #eval #arrow-functions
#JavaScript #TypeScript #babeljs #Вычисление #стрелка-функции
Вопрос:
У JavaScript нет проблем, он видит анонимную функцию стрелки, и ее .toString()
метод возвращает именно это.
// This returns as expected
// ie `() => ""`
const t = [() => ""];
console.log(t[0].toString());
В этом примере используется Babel, но то же самое происходит в TypeScript. TypeScript видит анонимную функцию со стрелкой и пытается создать оператор анонимной функции, который недействителен при попытке запуска eval
на нем.
// This returns an incomplete function string
const t = [() => ""]
console.log(t[0].toString());
Запуск eval(t[0].toString())
вернет ошибку:
SyntaxError: Function statements require a function name
Есть ли способ сохранить правильный синтаксис при использовании Babel / TypeScript? Есть ли какой-то другой лучший способ добиться этого?
Ответ №1:
Результирующая строка:
function () { return ""; }
Это не может быть проанализировано должным образом, потому что, как говорится в прочитанной вами ошибке:
Для операторов функции требуется имя функции
function () { return ""; }
Без имени оно может существовать только в контексте выражения. Это работает, когда Babel не используется, потому что синтаксически разрешены автономные выражения функции стрелки, а автономные безымянные function
выражения — нет.
Одним из способов было бы присвоить функцию переменной при вводе eval
:
var t = [function() { return "abc"; }]
var result = eval(`var fn = ${t[0].toString()}; fn();`);
console.log('result:', result);
(Но вам также следует подумать, eval
действительно ли это необходимо — во многих случаях его использование указывает на неэлегантное X-решение проблемы XY — подумайте, есть ли какой-либо способ реорганизовать ваш скрипт, чтобы избежать eval
. Иногда eval
это необходимо, но часто это не так.)