Pergunta

Por que isso não produz nada?

console.log(JSON.stringify(function(){console.log('foobar');}));
Foi útil?

Solução

JSON não pode restringir funções, ele as trata exatamente como undefined ou null valores.Você pode verificar o algoritmo exato em EcmaScript 5.1 §15.12.3, veja também o descrição no MDN.

No entanto, é claro que você pode restringir a expressão da função convertendo-a em uma string, tente

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

Outras dicas

JSON não tem como representar uma função.É um formato de dados projetado para simplicidade e compatibilidade entre idiomas (e uma função é a última coisa que será compatível com vários idiomas).

Dos documentos para JSON.stringify:

Se indefinido, uma função ou um valor XML for encontrado durante a conversão, ele será omitido (quando for encontrado em um objeto) ou censurado para nulo (quando for encontrado em uma matriz).

Você não pode fazer isso, mas existem algumas bibliotecas de terceiros que podem ajudá-lo, como: https://www.npmjs.com/package/json-fn

Se você quiser usar JSON.stringify para converter também funções e objetos nativos você pode passar uma função conversora como segundo argumento:

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))

Retornar undefined da função de conversor se desejar omitir o resultado.

O terceiro parâmetro é quantos espaços você deseja que a saída recue (opcional).

yourFunctionName.toString(); também irá restringir uma função

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top