Мне интересно, есть ли способ рекурсивной строковой функции?
Я думаю, мы можем просто продемонстрировать, что это вообще невозможно.
Давайте подумаем об этих двух функциях
const greet = (greeting) => (name) => `${greeting} ${name}`
const sayHi = greet ('Hi')
sayHi ('Jane') //=> "Hi Jane"
Хотя на вашем примере foo
и bar
мы могли бы представить что-то, что проверило бы тело функции и использовало все доступное в текущей области, чтобырасширенная функция stringify, основанная на анализе функции и знании того, какие локальные переменные фактически используются. (Я предполагаю, что это тоже было бы невозможно по причинам, связанным с теоремой Райса , но мы, конечно, можем себе это представить.)
Но здесь обратите внимание, что
sayHi.toString() //=> "(name) => `${greeting} ${name}`"
и так sayHi
зависит от свободной переменной , которая не хранится в нашей текущей области, , а именно greeting
. Мы просто не сохранили «Привет», использованный для создания этой функции в любом месте , за исключением области закрытия sayHi
, которая нигде не отображается.
Так что даже эта простая функция не моглабыть надежно сериализованным;кажется, мало надежды на что-то более сложное.