¿Por qué no se puede cadenar una expresión de función?
-
11-12-2019 - |
Pregunta
¿Por qué esto no produce nada?
console.log(JSON.stringify(function(){console.log('foobar');}));
Solución
JSON no puede rigir las funciones en absoluto, las maneja como los valores de undefined
o null
.Puede consultar el algoritmo exacto en ECMASCRIP 5.1 §15.12.3 , consulte también la Descripción en MDN .
Otros consejos
JSON no tiene medios para representar una función.Es un formato de datos diseñado para simplicidad y compatibilidad a través de idiomas (y una función es lo último que será compatible con el idioma cruzado).
de los documentos para json.stringify :
Si no está definido, una función, o un valor XML se encuentra durante la conversión, se omite (cuando se encuentra en un objeto) o se censura a NULL (cuando se encuentra en una matriz).
No puede hacer eso, pero hay algunas bibliotecas de terceros, pueden ayudarlo a hacerlo, como: https://www.npmjs.com/package/json-fn
Si quieres usar JSON.stringify
para convertir también funciones y objetos nativos, puede pasar una función de conversión 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))
Devolver undefined
desde la función de conversión si desea omitir el resultado.
El tercer parámetro es cuántos espacios desea sangrar la salida (opcional).
yourFunctionName.toString();
también rinificará una función