Por que você não pode restringir uma expressão de função?
-
11-12-2019 - |
Pergunta
Por que isso não produz nada?
console.log(JSON.stringify(function(){console.log('foobar');}));
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