Aujourd'hui J'ai lu que nous avons un moyen de déclarer la fonction par le constructeur de fonctions . Mais je n'ai jamais vu la mise en œuvre réelle qui utilise constructeur de fonction em> p> fonction (): < / em> p> merci p> p> fonction code> constructeur en réel. Donc, je voudrais demander, y a-t-il des circonstances que nous pouvons bénéficier en utilisant code> constructeur code> par opposition à l'utilisation de la fonction () code> déclaration? Et quelles sont les différences cachées entre? (S'il y a un)
4 Réponses :
Eh bien, la différence évidente lorsque vous travaillez avec Strings est que vous avez la possibilité de méta-programmation, en construisant la chaîne au moment de l'exécution (la même chose que possible avec Un avantage latéral de la version régulière em> (non-string) est que la plupart des minificateurs de JavaScript (ou Obfuscators) sauront quoi faire avec elle. Cela semble improbable pour la chaîne, c'est-à-dire qu'ils le laisseront "tel quel" (non minifiée ni obscurcie). P> eval code>). Cependant, cela est à double tranchant et conduit sans doute à une gamme d'autres problèmes avec une concaténation littérale (injection) et peut-être simplement la complexité. Si vous ne pas besoin em> la version à chaîne, je ne l'utiliserais pas pour être honnête. P>
@BraveYard - FAIT Droit i> La programmation méta est bien; Mais c'est aussi un excellent moyen d'ouvrir des trous XSS si cela s'est mal fait. Par exemple, si l'utilisateur peut abuser de la chaîne pour obtenir d'autres utilisateurs à poster leurs cookies à vous.
Si vous écrivez un analyseur JavaScript et interprétez une chaîne en fonction de la fonction, vous pouvez utiliser un constructeur de fonction. Par exemple, si vous êtes donné: et vous avez une sorte d'analyseur lexical et il trouve que la sous-chaîne est en effet une fonction, de le traduire en une fonction réelle que vous utiliseriez une nouvelle fonction sinon il n'y a vraiment pas une grande partie d'une utilisation que je peux penser. p> p> code> et ajoutez-le à votre arbre. p>
Le constructeur de la fonction est une forme de En outre, les fonctions créées avec le constructeur de la fonction ne conservent pas une référence à l'environnement qu'ils ont été définis dans (la fermeture). Lorsqu'il est exécuté, ils tireront ces variables directement à partir de la portée globale. P> tandis que les fonctions régulières gardent une référence à l'environnement dans lequel ils ont été définis: P> < Pré> xxx pré> p> eval code>, qui devrait généralement être évitée (c'est lent et considéré comme insécurisé). Il n'y a vraiment aucun avantage à utiliser le constructeur de la fonction sur l'instruction de fonction intégrée, à moins que vous souhaitiez construire une fonction à partir de composants dynamiques, ce qui est assez rare. Il existe des utilisations légitimes pour ce formulaire, mais la plupart du temps, elle est utilisée inutilement, ce qui est la raison pour laquelle il est baissé et généralement évité.
Je me demande ce qu'ils pensaient lors de la construction de cette code> objet code>.
Eh bien, c'est assez utile pour quelque chose comme le concours JS1K :-)
@Daniel, note que la partie "lente" serait seulement la fonction compilation i>, après la construction d'un objet de fonction, elle se comportera exactement comme si elle a été créée avec un FunctionDeclaration code> ou a exécutexpression code>.
@CMS: Oui, bien sûr. Mais comme nous sommes sur le thème du constructeur, je pensais que ce serait une bonne idée d'inclure les conséquences possibles de l'utilisation de la méthode du constructeur. Ce test hautement non scientifique montre que la différence est non négligeable: JSPERF.function-Constructor -Vs-Fonction-Literal Bien que j'avoue que dans le grand schéma des choses, il ne sera probablement pas remarqué par l'utilisateur.
Cela ne teste que la différence de définition de la fonction, qui ne l'exécutent pas. C'est tout le point. La construction dynamique d'une fonction peut améliorer les performances en supprimant les contrôles conditionnels inutiles, la dérive de la boucle, etc. Les cas où une telle réglage fine est nécessaire sont rares, mais elles existent. Il y a aussi quelque chose à dire pour créer une fonction qui ne capture pas de grappes de variables inutiles dans une fermeture.
@MOOGOO: Oui ... c'était l'intention du test. Il a été établi qu'il n'y a pas de différence dans les temps d'exécution. Cette question concerne les différentes méthodes de déclarant i> une fonction.
Je ne pense pas que les différences de performance concernant la définition d'une fonction soient toujours en doute. Je pense juste qu'il est important de souligner que nouvelle fonction! = Eval code> en matière de vitesse. Redéfinir continuellement une fonction dans une boucle avec le constructeur code> code> pour tester sa performance n'est pas différent de l'utilisation de eval code> directement, mais c'est trompeur parce que c'est jamais i> Comment le constructeur de la fonction serait utilisé.
Notes supplémentaires à Cristian Sanchez 'Posting.
Vous ne pouvez jamais accéder aux varaces de la portée locale dans une "fonction"-évaluation. p>
permet de voir la différence entre la fonction et l'évaluation. p> Exemple de la fonction: p> Le constructeur de fonction ne sait rien de la portée locale, car il crée une nouvelle portée isolée sous la fenêtre / Objet global - pas au poste où il s'agit - c'est la différence principale envers Eval. P> Eval-Exemple: P> function SomeClass()
{
this.a = 1;
}
var cls = new SomeClass();
SomeClass.constructor("this.a = 2;").call(cls);
cls; // SomeClass {a: 2}, because "SomeClass.constructor" === Function
Voir: Utilisations légitimes du constructeur de la fonction
Bonne vidéo sur les fonctions JavaScript développeur.yahoo.com/yui/theater /video.php?v=crockonjs-3
@CMS @THOMAS, merci pour les liens.