Javascript, des fermetures et des effets secondaires en anglais? (séparément)
J'ai été lire un peu de JavaScript livres et j'entends toujours sur les fermetures et les effets secondaires. Pour une raison que je ne peux pas comprendre ce qu'ils sont vraiment. Quelqu'un peut-il m'expliquer ce qu'ils sont en anglais ainsi que des exemples? (comme vous l'ont expliqué à quelqu'un avec le niveau de programmation d'un graphiste).
- Veuillez préciser: Êtes-vous demander une explication pour les fermetures et les et séparément pour une explication des effets secondaires? Ou sur les deux à la fois?
- désolé j'ai modifié le titre.
- Ensuite, voir stackoverflow.com/questions/111102/... et supprimer les fermetures de la partie, ce serait un doublon. Effets secondaires ne sont pas tout à fait nouveau, mais je ne suis pas au courant de quelque chose de spécifique, et donc je ne suis pas de vote pour le fermer pour l'instant.
- C'est à deux questions, l'une sur les effets secondaires et un sur les fermetures, et doivent être séparés. Comme delnan notes, les fermetures ont été couverts avant, il est donc préférable de faire de cette question sur les effets secondaires et consulter l'autre question, pour une explication sur les fermetures.
Vous devez vous connecter pour publier un commentaire.
Effets secondaires sont le plus facile concept. Une "fonction pure" est une fonction que les cartes de sa valeur d'entrée(s) en une valeur de sortie
function plus(x, y) { return x + y; }
. Un "effet secondaire" est d'autre effet que de valeur de retour. Ainsi, par exemple:a aussi pour effet de déclencher une alerte de dialogue et d'interaction de l'utilisateur). Chaque code de fonction a certains effets secondaires (ils consomment de la mémoire et de prendre du temps, si rien d'autre), mais quand les gens parlent d'effets secondaires, ils sont souvent les plus concernés avec soit IO (comme la boîte de dialogue d'alerte ci-dessus) ou l'écriture de l'etat qui vit au-delà de la période d'exécution de la fonction.
Le défi avec des effets secondaires, c'est qu'ils font de fonctions plus difficile à comprendre et à réutiliser. (Il est beaucoup plus facile de la raison et de la réutilisation des fonctions qui sont au plus près de "des fonctions pures" que possible, car ils ont tendance à "faire une chose bien.")
def
n'est pas Python-spécifiques et l'exemple ne serait pas en Python, comme elle l'a accolades et qui ne sont pas propres à l'indentation. C'est plus une notation dans un pseudo-code ou même en mathématiques à montrer ce qu'est un pure fonction.def
ici vraiment justifié? C'est un code Javascript spécifique de la question et le code sinon est entièrement en Javascript. Il n'y a rien pseudo à ce sujet autre que ledef
. Il suffit de changer àfunction
...def
àfunction
dans un projet de modifier maintenant.Fonctions avec effets secondaires ne sont autre chose que de retourner une valeur (bien qu'ils puissent en faire autant). Si vous pouvez remplacer tous les appels de fonction pour les arguments donnés avec la valeur de ces arguments, le programme a le même comportement, il n'y a pas d'effets secondaires. Cela nécessite que la fonction retourne toujours la même valeur pour les arguments donnés.
Admettons que
f(1,2) == 12
. Si vous pouvez toujours les remplacerf(1,2)
avec12
et le programme se comporte de la même façon, puisf
a pas d'effets secondaires de ces arguments. D'autre part, si dans un lieuf(1,2) == 12
et un autref(1,2) == 13
, puisf
a des effets secondaires. De même, si le programme a cessé d'envoyer un e-mail après le remplacement def(1,2)
avec 12, puisf
a des effets secondaires. Généralement, sif(x,y) == z
(où z dépend de x et de y) et vous pouvez toujours les remplacer tous lesf(x,y)
appel avecz
, puisf
a pas d'effets secondaires.Quelques fonctions simples avec des effets secondaires:
Effets secondaires:
Penser à un effet secondaire comme quelque chose qui ne deux choses à la fois.
Par exemple:
Exemple classique d'un effet secondaire:
L'effet secondaire se produit à
i++
. Ce qui se passe ici estj
devient 1 eti
est incrémenté et devient 2. En d'autres termes, deux choses qui s'est passé et l'effet secondaire est quei
est devenu 2.Fermeture:
De visualiser une chaîne de liens comme ceci: <><><><><><><>.
Imaginez que le nom de cette chaîne de liens est appelé le étendue de la chaîne d'. Ensuite, imaginez que tous ces liens se connecter objets ensemble, comme ceci: <>object<>object<>object<>.
Maintenant, gardez à l'esprit les points suivants:
(1) Tous les portée des chaînes de commencer avec l'objet global.
(2) Lorsqu'une fonction est définie, une chaîne de domaine pour que la fonction est stockée.
(3) Lorsqu'une fonction est appelée, elle crée un nouvel objet et l'ajoute à la portée de la chaîne.
Maintenant, s'il vous plaît regardez l'exemple suivant:
Dans cet exemple, lorsque
counter()
est défini, le champ d'application de la chaîne de contre ressemble à ceci: <>global de l'objet<>. Puis, quandcounter()
est invoquée, le champ d'application de la chaîne d'ressemble à ceci: <>global de l'objet<>objet compteur<>. Après cela, la fonction sans nom (appelé une fonction anonyme) à l'intérieur de compteur est défini et invoquée. Le champ d'application de la chaîne pour la fonction anonyme une fois invoquée ressemble à ceci: <>global de l'objet<>objet compteur<>anonyme en fonction de l'objet<>Heres ont été la fermeture de la partie est en. Si vous remarquez, la fonction anonyme est à l'aide de la variable
count
qui a été définie en dehors d'elle. La raison en est que la fonction anonyme peut accéder à toutes les variables définies dans son champ d'application de la chaîne d'. C'est ce qu'une fermeture est une fonction ainsi que les références de toutes les variables dans son stockée étendue de la chaîne.Cependant, dans l'exemple ci-dessus, une fois le retour des fonctions, les objets créés lors de l'invocation sont jetés alors il n'y a vraiment aucun point. Maintenant, regardez le suivant:
Dans cet exemple, je suis de retour d'une fonction nommée
f
et l'assigner à la variablecount
. Maintenant, la variablecount
contient une référence à l'ensemble de la chaîne d'étendue et de ne pas se jeter. En d'autres termes, la variable de comptage des magasins de la chaîne d'étendue comme ceci: <>global de l'objet<>objet compteur<>anonyme en fonction de l'objet<>. C'est la force de fermeture, vous pouvez maintenir une référence à une chaîne de domaine, et de l'appeler comme ceci:count()
.counter
est invoquée, ce qui signifie que chaque fonction renvoyée aura une portée chaîne avec un autre l'activation de l'objet pourcounter
, et donc un autre ensemble de variables locales (commecount
). Voir cette réponse pour plus d'info.Exemple
Lors de l'externe (de) die, la fonction func() de continuer à vivre, et cette utilisation pratique
Je suis nouveau sur le JavaScript, et ne pas essayer de parler de fermetures. Cependant, mon facteur de nouveauté JavaScript qui me rend tout à fait conscient de l'utilisation des effets secondaires qui sont impossibles dans mes habitudes de langage de programmation (Erlang).
Effets secondaires semblent être une façon habituelle à changer d'état en JavaScript. Prenez par exemple cet exemple de la w3cschools.com site web:
Ici il n'y a pas de paramètres d'entrée ou valeur de retour, plutôt que le contenu du document pour se changer, car ils sont de portée mondiale à la fonction. Si vous deviez écrire ce en Erlang par exemple, le document sera transmis en tant que paramètre, et le nouveau document de l'état serait renvoyé. Une personne qui lit le programme appelant serait de voir un document transmis et une altération de documents retournés.
Voir les fonctions appelées que de ne pas retourner explicite nouvel état doit d'alerte pour le programmeur d'utilisation probable des effets secondaires.