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!'; }
var storedFunction = foo.toString();
var actualFunction = new Function('return ' + foo.toString())()
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. 🙂