Почему вы не можете вызывать выражение функции?

Почему это ничего не дает?

console.log(JSON.stringify(function(){console.log('foobar');}));

Ответ 1

JSON не может полностью выполнять функции, он обрабатывает их точно так же, как значения undefined или null. Вы можете проверить точный алгоритм в EcmaScript 5.1 §15.12.3, см. Также описание в MDN.

Однако вы, конечно, можете выразить выражение функции, выставив их в строку, попробуйте

console.log("" + function(){console.log('foobar');})

Ответ 2

У JSON нет средств для представления функции. Это формат данных, разработанный для простоты и совместимости между языками (и функция является последней вещью, которая будет совместима между языками).

Из документов JSON.stringify:

Если значение undefined, при преобразовании встречается функция или значение XML, оно либо опускается (когда оно найдено в объекте), либо подвергается цензуре на ноль (когда оно находится в массиве).

Ответ 3

Вы не можете этого сделать, но некоторые сторонние библиотеки могут вам помочь, например: https://www.npmjs.com/package/json-fn

Ответ 4

yourFunctionName.toString(); также приведёт в порядок функцию

Ответ 5

Если вы хотите использовать JSON.stringify также для преобразования функций и собственных объектов, вы можете передать функцию преобразователя в качестве второго аргумента:

const data = {
  fn: function(){}
}

function converter(key, val) {
  if (val && typeof val === 'function' || val.constructor === RegExp) {
    return String(val)
  }
  return val
}

console.log(JSON.stringify(data, converter, 2))

Верните undefined из функции конвертера, если хотите опустить результат.

Третий параметр - это количество пробелов, которые вы хотите сделать для отступа (необязательно).