2010-04-16 13 views
5

L'appel de toString() sur la fonction ci-dessous renvoie différentes chaînes dans les navigateurs. Je comprends que c'est parce que ECMA-262 15.3.4.2 laisse la marge de manœuvre pour chaque fournisseur.JavaScript utilisant toString sur un objet Function pour lire le contenu du texte

Chrome renvoie les commentaires en plus de toute la syntaxe. Malheureusement, Firefox 3.6 omet les commentaires. Basé sur le comportement de Firefox, je n'ai pas testé IE, Opera ou Safari. Plus précisément, j'essaie d'incorporer des métadonnées dans un bloc de commentaire spécialement formaté au sein d'une fonction. Plus tard, la valeur de retour de la méthode toString() sera analysée et les valeurs renvoyées en tant qu'objet.

J'ai été incapable de localiser les tables de compatibilité ou les alternatives à toString(). La communauté a-t-elle des idées? Btw, le pré-traitement des fichiers JS n'est pas une option. :(

Merci beaucoup. :)

Répondre

1

Bien que pas aussi directe que l'intégration des commentaires, car les fonctions sont des objets de première classe dans JS, vous pouvez spécifier des propriétés arbitraires pour eux. E.g .:

> function f(x) { return x * x; } 
undefined 
> f 
function f(x) { return x * x; } 
> f.comment = 'Hello' 
Hello 
> f.comment 
Hello 

De cette façon, vous pouvez intégrer des métadonnées dans des objets fonction de manière propre et portable.

1

J'essayais de répondre à cette question récemment, et je suis tombé sur ceci. Pour une mise à jour, je suis toujours incapable de trouver une table de compatibilité, donc j'ai créé le violon suivant:

https://jsfiddle.net/deamvp7r/

if((function(){ /*test*/ }).toString().match('test').length === 0) { 
    alert ("NO SUPPORT"); 
} else { 
    alert ("SUPPORTED"); 
} 

et testé manuellement sur BrowserStack. Pour ce que ça vaut la peine, voici les navigateurs que je l'ai testé et ce que j'ai trouvé jusqu'à présent que le soutien de commentaire dans Function.toString():

  • IE8 - 11: Prise en charge des commentaires
  • Firefox < = 16: NO SUPPORT
  • Firefox> = 17: Prend en charge les commentaires
  • Chrome 14 +: Prise en charge des commentaires
  • IOS iPhone 3GS navigateur +: Supporte commentaires
  • iPad 1 +: Prise en charge commentaires
  • Android 2.3 (Galaxy) +: Prise en charge Commentaires

Cette liste est bien loin d'être exhaustive, donc soyez prudent si vous devez soutenir encore plus anciens/navigateurs plus obscurs. Mais le pourcentage de navigateurs populaires qui supportent les commentaires semble actuellement assez élevé.

0

La fonctionnalité "annotations" est une bonne solution pour ce que vous semblez essayer de faire. Actuellement, il est implémenté dans Traceur (voir here).Les annotations utilisent la syntaxe @, comme suit:

@Anno('foo') 
function func() {} 

Essentiellement, cela équivaut à

function func() {} 
func.annotate = [ new Anno('foo') ]; 

Les annotations peuvent également être mis sur les classes de ES6. Même si vous ne pouvez pas ou ne voulez pas utiliser la nouvelle syntaxe d'annotation, l'ajout de fonctions contenant des propriétés pour contenir leurs métadonnées semble être une meilleure idée que d'incorporer de telles métadonnées dans le corps de la fonction, que ce soit des commentaires ou autres (une idée est quelque chose d'analogue à "use strict"), puis en essayant de l'extraire en utilisant une manipulation de chaîne. La fonction d'annotation est encore dans la phase de discussion, et il existe des propositions parallèles de variations appelées "décorateurs" etc. Comme vous le savez probablement, le concept lui-même n'est pas nouveau, et se trouve dans d'autres langages tels que Python, Java , et C#. Les annotations sont en cours d'inclusion dans les versions linguistiques, notamment AtScript, TypeScript et ES7.

Voir aussi JavaScript annotations. Pour une approche basée sur l'analyse syntaxique, voir http://ariya.ofilabs.com/2014/04/tracking-javascript-annotations.html.