Comment puis-je sérialiser une fonction en JavaScript?

Par exemple, disons que j'ai une fonction définie comme suit:

function foo() { return "Hello, serialized world!"; } 

Je souhaite pouvoir sérialiser cette fonction et la stocker à l'aide de localStorage . Comment puis-je faire cela?

La plupart des navigateurs (Chrome, Safari, Firefox, éventuellement d'autres) renvoient la définition des fonctions à partir de la méthode .toString()

 > function foo() { return 42; } > foo.toString() "function foo() { return 42; }" 

Il suffit de faire attention car les fonctions natives ne seront pas sérialisées correctement. Par exemple:

 > alert.toString() "function alert() { [native code] }" 
 function foo() { alert('native function'); return 'Hello, serialised world!'; } 

Serialiser

 var storedFunction = foo.toString(); 

Désérialisation

 var actualFunction = new Function('return ' + foo.toString())() 

Explication

Foo.toString () sera la version en chaîne de la fonction foo

 "function foo() { ... return 'Hello, serialised world!';}" 

Mais la new Function prend le corps d'une fonction et non la fonction elle-même.

Voir MDN: Fonction

Nous pouvons donc créer une fonction qui nous renvoie cette fonction et l'affecte à une certaine variable.

 "return function foo() { ... return 'Hello, serialised world!';}" 

Donc maintenant, lorsque nous passons cette chaîne au constructeur, nous obtenons une fonction et nous l'exécutons immédiatement pour récupérer notre fonction d'origine. 🙂