web-dev-qa-db-fra.com

Appeler toString sur une fonction javascript renvoie le code source

Je viens de découvrir que lorsque vous appelez toString () sur une fonction javascript, comme dans myFunction.toString(), le code source de cette fonction est renvoyé.

Si vous l’essayez dans la console Firebug ou Chrome, il ira même jusqu’à le formater correctement pour vous, même pour les fichiers javascript minimisés.
Je ne sais pas ce qui se passe pour les fichiers obfusqués.

Quelle est l'utilisation d'une telle implémentation toString?

30
Sergi Papaseit

Il a une certaine utilité pour le débogage, car il vous permet de voir le code de la fonction. Vous pouvez vérifier si une fonction a été écrasée et si une variable pointe vers la bonne fonction.

Il a quelques utilisations pour le code javascript obfusqué. Si vous voulez faire de l'obscurcissement hardcore en javascript, vous pouvez transformer tout votre code en un ensemble de caractères spéciaux, sans laisser de chiffres ni de lettres. Cette technique repose en grande partie sur la possibilité d'accéder à la plupart des lettres de l'alphabet en forçant l'appel toString sur tout avec +"" (exemple: (![]+"")[+[]] est f). Certaines lettres, comme v, ne sont accessibles qu'en appelant toString sur une fonction native telle que [].sort. La lettre v est importante pour le code obscurci, car elle vous permet d'appeler eval, ce qui vous permet d'exécuter n'importe quoi, même des boucles, sans utiliser de lettre. Voici un exemple de ceci .

22
HoLyVieR

function.ToString - Retourne une chaîne représentant le code source de la fonction. Pour les objets Function, la méthode intégrée toString décompile la fonction dans la source JavaScript qui la définit. 

Lire ceci sur mozilla.

8
CloudyMarble

Vous pouvez l'utiliser comme une implémentation pour les chaînes multilignes dans le code source Javascript.

Comme décrit dans cet article de blog de @tjanczuk , l'un des inconvénients énormes de Javascript est les chaînes multilignes. Mais vous pouvez utiliser .toString() et la syntaxe pour les commentaires multilignes (/* ... */) pour produire les mêmes résultats.

En utilisant la fonction suivante :

function uncomment(fn){
  return fn.toString().split(/\/\*\n|\n\*\//g).slice(1,-1).join();
};

… Vous pouvez ensuite passer des commentaires sur plusieurs lignes dans le format suivant:

var superString = uncomment(function(){/*
String line 1
String line 2
String line 3
*/});

Dans l'article original, il était noté que le comportement de Function.toString() n'était pas standardisé et donc discret pour la mise en œuvre. L'utilisation recommandée était Node.js (où l'interpréteur V8 peut être utilisé); Cependant, un Fiddle que j'ai écrit semble fonctionner sur tous les navigateurs dont je dispose (Chrome 27, Firefox 21, Opera 12, Internet Explorer 8).

7
Barney

Un cas d'utilisation intéressant est la communication à distance. Il suffit de faire suivre la fonction dans le client, de l’envoyer par le fil et de l’exécuter sur le serveur.

1
R.Moeller

Mon cas d'utilisation - J'ai un programme de nœud qui traite les données et produit des rapports interactifs sous forme de fichiers html/js/css. Pour générer une fonction js, mon code de noeud appelle myfunc.toString () et l’écrit dans un fichier.

0
Ken Lin