Utilisation des fonctions pour initialiser et prendre des décisions JavaScriptUtilisation des fonctions pour initialiser et prendre des décisions Problème que vous voulez utiliser des fonctions pour initialiser et de prendre des décisions. Théorie Habituellement, lorsque vous écrivez un morceau de code où un changement de logique doit être fait en fonction d'un contexte, vous utilisez une structure de décision. Par exemple, disons que vous mettez en oeuvre un interrupteur de lumière utilisant un programme. Vous allumez la lumière si la lumière est éteinte, et que vous éteignez la lumière si la lumière est allumée. Le comportement du programme est déterminée par les conditions. Un exemple de comportement qui mérite un examen plus détaillé de l'initialisation. L'initialisation devrait généralement se faire que si elle n'a pas déjà fait. L'initialisation est importante parce que la logique d'initialisation crée le cadre par défaut de votre application fonctionne correctement. Solution A titre d'illustration, nous allons passer par un exemple où une fonction requiert une initialisation qui est incorporé dans la fonction. La logique consiste à effectuer une initialisation, si elle n'a pas déjà eu lieu. La fonction qui est appelée est définie comme suit, et il embarque un appel à l'initialisation.
Astuce Vous pouvez utiliser ce type de code à mettre en œuvre une initialisation tardive lors de l'écriture fondées sur les conventions de code qui n'effectue pas une initialisation explicite. Source: / website / ROOT / ajaxrecipes / javascript / fonction makingdecisionsinitialization.html ClassicalManipulateObject (obj) (info ( "ClassicalManipulateObject", "départ"); if (! didInitialize) ( DoInitialization (obj); ) else ( info ( "ClassicalManipulateObject", "Pas d'initialisation"); )assertEquals (3, obj.value); info ( "ClassicalManipulateObject", "Ending");)
Dans l'exemple, le code en gras trait à la fonctionnalité d'initialisation. didInitialize est une variable indicateur qui peut être soit vraie ou fausse. Si le didInitialize variable est fausse, alors l'initialisation n'a pas eu lieu, si le didInitialize variable est vrai, alors l'initialisation a eu lieu. Si l'initialisation n'a pas eu lieu, la fonction DoInitialization est appelée. Notez que dans la logique est une variable qui indique si l'initialisation a eu lieu et une fonction pour faire l'initialisation. Ce code est problématique parce que la variable doit être définie quelque part, et la variable doit être assignées, quelque part. Et quelque part il ya une référence croisée entre les variables d'état et l'appel de la fonctionnalité d'initialisation. Une solution consiste à intégrer une grande partie de la logique d'initialisation dans le contexte de la fonction DoInitialization. Mais le fait est qu'il ya quelque part une variable, et quelque part il ya une fonction d'initialisation, et quelque part il ya une référence croisée entre la variable et la fonction d'initialisation. Alors, où vous placez la logique n'est pas pertinente dans une image «grand» sens. Une autre solution est de penser à la fonctionnalité d'initialisation non pas comme une décision, mais comme un état. Il ya un état initial, qui consiste à effectuer une initialisation, et un autre État ne réaliser aucune initialisation. En un sens, la didInitialize variable est une représentation de l'Etat. Garder cela à l'esprit, vous savez que JavaScript traite ses fonctions en tant qu'objets. Ainsi, le didInitialize variable peut être une fonction et non une variable booléenne. Traitement de l'État comme une variable qui fait référence à une fonction permet de simplifier la fonction qui nécessite une initialisation. La mise en œuvre de la fonction ClassicalManipulateObject est changé en ManipulateObject, comme illustré dans le code suivant. Source: / website / ROOT / ajaxrecipes / javascript / fonction makingdecisionsinitialization.html ManipulateObject (obj) (info ( "ManipulateObject", "départ"); InitializeObject (obj);assertEquals (3, obj.value); info ( "ManipulateObject", "Ending");) Dans la mise en œuvre de modification, le code en gras représente de nouveau la fonctionnalité d'initialisation. Ici il n'ya pas de décision qui vient d'un appel de fonction à InitializeObject. Vous pourriez penser, "j'aurais pu faire la même chose avec la décision-initialisation fondée, que la décision est mise en œuvre InitializeObject." Mais cette affirmation est inexacte, car dans la mise en œuvre de InitializeObject, il n'y a pas de décision. La mise en œuvre de InitializeObject initialise la variable et permet alors le traitement pour continuer. S'il n'y a pas de décision à savoir si l'initialisation a eu lieu et InitializeObject représente une fonction pour initialiser l'état, alors, pour chaque appel de l'État sera initialisé, vous ne pouvez pas appeler cette fonctionnalité d'initialisation. La magie réside dans le fait que JavaScript traite les fonctions de objets. La mise en œuvre de InitializeObject est la suivante: fonction InitializeObject (obj) (obj.value = 3; info ( "InitializeObject», «faire l'initialisation"); InitializeObject = InitializeEmptyObject;) Dans la mise en œuvre de InitializeObject, le paramètre obj est initialisé à une valeur de 3, et le code de gras correspond à la réaffectation de la fonction InitializeObject. Le InitializeObject réaffecté référence à une fonction sans corps, ce qui signifie que la première fois InitializeObject est appelée, l'initialisation est effectuée, mais par la suite, chaque appel est un appel de fonction vide qui ne fait rien. Il s'agit de la mise en œuvre complète de la fonctionnalité d'initialisation sans utiliser une seule décision ou variable. Un avantage de cette approche est que vous n'avez pas besoin de comprendre quelle variable de contre-référence avec la fonction. La fonction prend soin d'elle-même, et l'appelant peut continuer à appeler InitializeObject, sachant que tout sera pris en charge. Un autre avantage de cette approche est que vous créez un moteur de l'Etat où l'état suivant est déterminé par l'exécution de l'état actuel . Il n'existe pas de centrale bloquer la décision qui détermine le débit global d'exécution et les besoins de mise à jour chaque fois qu'un nouvel Etat doit être intégrée. Normalement, lorsque l'écriture de code dans un langage tel que Java, C # ou C + +, on ne va pas autour de la réaffectation la mise en œuvre de la fonction définie. Et parce que ce comportement est ancré dans l'esprit des développeurs, ils ne sont pas envisager de le faire, même pas. Pourtant, il n'y a absolument aucun problème de réaffectation des fonctions en JavaScript, parce que les fonctions sont des objets. Fonctions ne sont pas des identifiants uniques avec des fonctionnalités uniques, comme vous penser à eux quand on travaille avec eux dans d'autres langues. La mise en œuvre de InitializeObject fonctionne et est une solution complète. Mais il ya un petit inconvénient en ce que, une fois InitializeObject a été affecté à une fonction vide, la fonctionnalité d'initialisation n'est perdu tant que la page HTML est actualisé. Pour certains problèmes, c'est une solution acceptable. Par exemple, vous enveloppez XMLHttpRequest qu'une seule fois parce que vous pouvez instancier XMLHttpRequest en seulement un navigateur certaine manière spécifique. Il ya certains cas, toutefois, lorsque vous voudrez peut-être remis à zéro et initialiser à nouveau, et d'être capable de faire cela, vous avez besoin d'envelopper InitializeObject en une fonction dans une fonction, comme le démontre l'exemple suivant. Source: / website / ROOT / ajaxrecipes / javascript / fonction makingdecisionsinitialization.html ResetInitializeObject () (InitializeObject = function (obj) (obj.value = 3; info ( "InitializeObject», «faire l'initialisation"); InitializeObject = InitializeEmptyObject;)) ResetInitializeObject ( ); La fonction InitializeObject est une variable qui est assignée une fonction d'implémentation dans le contexte ResetInitializeObject. Recette 2-4 montre qu'il n'ya pas de différence dans la façon dont une fonction est déclarée, même si cela semble bizarre ou hors de propos. Pour initialiser InitializeObject, la fonction est appelée ResetInitializeObject, créant ainsi la fonction InitializeObject. InitializeObject Et lorsqu'il est appelé va se réaffecter à une fonction vide. Calling ResetInitializeObject réinitialise à nouveau l'initialisation, permettant InitializeObject pour initialiser l'état et se remette en plus. De cet exemple, vous pouvez voir que cette décision n'est pas besoin d'être implémenté en utilisant une instruction if. Un autre exemple qui illustre comment un moteur d'État pourraient être mis en œuvre suit. L'exemple met en oeuvre un interrupteur de lumière, où si la lumière est allumée, elle est désactivée, et vice versa. Notez que pas une seule instruction if est utilisé dans cet exemple. Source: / website / ROOT / ajaxrecipes / javascript / fonction makingdecisionsinitialization.html ToggleLight () (ToggleLight.on = function () (ToggleLight.curr = ToggleLight.off; retour "on";) ToggleLight.off = function () (ToggleLight.curr = ToggleLight.on; return "off";) try (return ToggleLight.curr ();) catch (e) (info ( "ToggleLight", "initialisation ..."); ToggleLight.on return ();)) Le ToggleLight fonction est appelée chaque fois que vous voulez allumer la lumière ou à l'extérieur. Il n'ya pas de paramètre pour indiquer une sur ou un repos; que la fonctionnalité est intégrée dans la fonction ToogleLight. Dans la mise en œuvre ToggleLight il ya deux propriétés, sur et en dehors, qui sont tous deux fonctions. Le sur la fonction assigne la propriété Curr éteint et retourne un "sur" la mémoire tampon. La fonction hors assigne la propriété Curr éteint et retourne un "off" tampon. Pour changer l'état, la propriété Curr qui est définie comme une fonction est appelée. La vocation de devise est ancrée dans un bloc d'exception, parce Curr ne sera pas initialisé la ToggleLight première fois est appelé. Ainsi, une exception est générée, et dans la partie des captures du bloc exceptionnel, le sur la propriété (qui est une fonction) est appelée. Appelant les affecte automatiquement curr et initialise l'Etat. Il est important de se rappeler que l'utilisation d'un bloc d'exception et invitant est acceptable parce qu'il est un mode de mise en œuvre de l'initialisation tardive. Lors de l'écriture des blocs et des fonctions de décision, pensez à l'État et les aspects suivants de cette recette: • Votre programme n'a pas besoin d'inclure le plus grand nombre de décisions, car les décisions ont été remplacés par des Etats différents. • Vous pouvez réaffecter les fonctions si vous pouvez décomposer le problème en un problème de moteur de l'Etat. • Vous pouvez être plus flexible avec des fonctions réaffecté parce que le comportement peuvent être substitués dynamiquement. Par exemple, si vous avez besoin de deux initialisation étape grâce à une décision, que des moyens supplémentaires si les états altérés dans un endroit central du code source. Utilisation d'une fonction d'affectation nouvelle, vous créez un moteur de l'Etat où le comportement peut être modifié lors de l'exécution au niveau local. • Quand vous lisez à travers des exemples cette recette, vous mai ont pensé: «Pourquoi ne pas utiliser une classe et l'objet?" La réponse est qu'une fonction est un objet et les exemples sont la programmation orientée objet. Le code semble bizarre parce que nous supposons normalement une fonction est une fonctionnalité utilisée pour créer une classe, et que les classes ne sont généralement pas les fonctions. Si la notation de vous dérange, mon conseil est de laisser cette fonction de ragoût de JavaScript dans votre esprit un peu. Vous allez sûrement le voir est un moyen puissant de programmation. Note Pour un autre exemple d'utilisation de la récursivité, au lieu d'utiliser des blocs de décision. un article présenté par Sonja Lande Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite. Important: Cet article «Utilisation des fonctions pour initialiser et prendre des décisions JavaScript" a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.
|
|||||
| Online: 355 users browsing the articles directory |
|
|