Redéfinition de la fonction JavaScript
Est-il possible de redéfinir une fonction JavaScript à partir de l'intérieur de son propre corps. Par exemple, je pourrais faire par la suite?
function never_called_again(args) {
//Do some stuff
never_called_again = function (new_args) {
//Do some new stuff
}
}
Est ci-dessus et valide-t-elle la sémantique correcte? Je ne veux pas créer une nouvelle variable globale avec l'ancien nom de la fonction, parce que je suis en train de faire ce genre de chose n'est pas dans la portée globale, mais à partir de divers objets étendues, et je ne veux pas les collisions de noms quand j'ai redéfinir la fonction à l'intérieur de ces domaines locaux.
source d'informationauteur davidk01
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez redéfinir une fonction de cette façon.
:
Rendements ceci:
Il est en effet possible de redéfinir une fonction à partir de son corps. La technique est utilisée dans le soi-disant Paresseux Définition De La Fonction Du Motif.
Il ressemble à ceci:
Cette fonction stocke la Date du premier appel, et renvoie cette Date par la suite.
Si vous comparer ce avec la motif de modulela différence est que l'initialisation ne se produit que quand il est d'abord appelé, pas quand elle est définie. Pour coûteux initialisations il peut être un énorme bénéficier.
C'est tout à fait possible de redéfinir un objet de fonction dans tout ce que vous voulez dès le premier appel.
La raison pour cela est possible parce que la cession des évaluations est gérée à partir de la droite vers la gauche. Cela signifie que la portée de la fonction est capturé lors de l'exécution de celui-ci (dans ce cas, lorsque vous appelez la fonction).
Cela signifie que, au moment de l'exécution, la fonction de l'objet qui est exécutée et l'original de la définition de fonction sont en fait deux choses différentes, ce qui permet à la redéfinition de la fonction d'origine comme, eh bien... rien.
L'un des meilleurs (et des plus cool) façons de les utiliser, c'est par la création d'une fonction qui est, par essence, de sa propre usine. De cette façon, vous n'avez pas à effectuer autour d'un grand nombre de définitions d'objets qui ne sont pas va être utilisé.
Exemple:
Votre exemple de base est le même:
Puisque vous savez sans doute que cela fonctionne:
il est clair que le premier exemple fonctionne aussi.
Si vous avez réellement voulez pour ce faire ou pas est plus question ouverte. Il va les rendre le code plus difficile à comprendre?
Oui, c'est possible, et il ne va pas créer une fonction globale. J'ai vérifié cela dans Internet Explorer 6, Firefox, Chrome, et Opéra.
Considérons le code suivant:
Cela print "Hello World {code de la fonction}" la première fois de la never_called_again et la deuxième fois, il affichera "bonjour {changé de code de la fonction}" la deuxième fois.
Mais quand on l'appelle sur le onclick du bouton, il renvoie une erreur indiquant que la fonction n'est pas définie, ce qui indique clairement que la fonction a été ré-défini (et non pas créé à l'échelle mondiale).
À proprement parler, non, il n'est pas possible de redéfinir une fonction JavaScript. Si c'est un peu une question de sémantique.
Une fonction peut remplacer sa référence, dans certaines limites, avec un autre fonction, qui sert comme un tour de main, où une autre fonction s'affiche à la place de la première. par exemple,
De même, une fonction peut utiliser l'état d'un closured portée à se comporter différemment la deuxième fois de son nom (évidemment pas de "redéfinition").
L'exemple suivant illustre pourquoi le schéma ci-dessus n'est pas redéfinition, car il dépend de la portée parent qui ne peut être partagée avec le contexte appelant.
La fonction appelée comme
greet_always
(qui imprime toujours "Bonjour") est le même, attribué à l'origine àgreet_once
.Le plus proche je crois que vous pouvez obtenir à la redéfinition d'une fonction est de réaffecter ses appliquent et l'appel de méthodes, ce qui produit un scénario où
myFunction.call()
est différente demyFunction()
ce qui est étrange, mais éventuellement utile.