Quand SE, qui n'a touché que Java, a touché JavaScript pour la première fois Je n'ai pas pu le mettre en œuvre comme je m'y attendais, alors j'ai pris note.
Vous pouvez déclarer n'importe quelle variable avec "var". Les variables peuvent contenir des ** fonctions ** ainsi que des valeurs.
Lorsque vous écrivez une méthode en Java, écrivez-la en dehors de la classe ou de la méthode et appelez-la. En JavaScript, il existe d'autres manières d'écrire.
Définissez une fonction et placez-la dans une variable. Il n'y a pas de nom de fonction, et lors de son appel, appelez-la par nom de variable.
sample01.js
//Définition de fonction et déclaration de variable
var hoge = function(counts) {
//En traitement
};
//Appel de fonction
hoge(i);
Version de la méthode de la classe interne si elle est exprimée en Java. Défini et appelé tel quel.
sample02.js
//Définition de fonction et appel de fonction
(
function(counts) {
//En traitement
}
)(i);
Java exécute le traitement et les appels de méthode dans l'ordre du haut, En JavaScript, même si une fonction est appelée, elle peut être exécutée après la fin d'un autre traitement, et elle ne s'est pas comportée comme Java.
J'ai vu dans divers articles que JavaScript est asynchrone, donc Comme le traitement asynchrone de Java, j'ai été sérieusement brûlé quand je pensais "traitement parallèle multi-thread!"
(Référence) Avez-vous confondu le traitement asynchrone JavaScript avec le traitement parallèle?
J'ai pensé: "S'il est multi-thread, il ne peut pas être aidé si la fonction appelée est exécutée à un moment non souhaité." J'étais encore plus confus quand j'ai réalisé qu'il n'était pas multi-thread en premier lieu. Étant donné que JavaScript est monothread, Après tout, il est étrange que le traitement à l'intérieur de la fonction ne soit pas exécuté au moment où la fonction est appelée, pourquoi? Si vous pensez que vous appelez la fonction Il semble que le traitement dans la fonction n'est pas exécuté mais est enregistré dans la file d'attente d'exécution.
sample03.js
//Fonction appelant
function A() {
console.log('aaa');
B();
console.log('ccc');
};
//Fonction à appeler
function B() {
console.log('bbb');
};
S'il existe une fonction comme celle ci-dessus et que la fonction A est appelée, l'ordre de traitement est le suivant en Java. Il exécute le traitement dans l'ordre décrit et appelle la fonction. A.1 Début de l'exécution de la fonction A A.2 Sortie "aaa" A.3 Fonction d'appel B B.1 La fonction B lance l'exécution B.2 Sortie "bbb" B.3 Fin d'exécution de la fonction B A.4 sortie "ccc" A.5 Fin d'exécution de la fonction A
Cependant, dans le cas de JavaScript, l'ordre de traitement est le suivant. A.1 Début de l'exécution de la fonction A A.2 Sortie "aaa" ** A.3 Enregistrer la fonction B dans la file d'attente d'exécution ** A.4 sortie "ccc" A.5 Fin d'exécution de la fonction A B.1 La fonction B lance l'exécution B.2 Sortie "bbb" B.3 Fin d'exécution de la fonction B
En JavaScript, le traitement de la fonction B n'est pas exécuté lors du traitement de la fonction A. Cela ne fonctionne pas comme je m'attendais à l'écrire comme Java. Il est nécessaire de décrire la source en gardant à l'esprit la file d'attente d'exécution. Si vous connaissez cette différence, cela fonctionnera comme vous le souhaitez, mais cette fois, je ne sais pas comment gérer la valeur de retour. Comment puis-je recevoir la valeur de retour de la méthode et continuer le traitement?
JavaScript qui exécute le traitement fonction par fonction Par exemple, que se passe-t-il si vous souhaitez continuer le traitement en utilisant la valeur de retour de la fonction appelée? J'ai soudainement trouvé un moyen d'arrêter d'appeler des fonctions et d'écrire tout le traitement dans une seule fonction. Dans ce cas, vous pouvez faire comme décrit dans l'ordre de traitement sans avoir connaissance de la file d'attente d'exécution! Je n'ai pas pu le lire. À ce stade, nous atteignons enfin la signification du rappel.
Je le vois beaucoup, mais je n'ai pas compris la signification de son existence. J'ai compris que JavaScript est un seul thread et que l'unité de traitement est une fonction, et j'ai trouvé la signification de l'existence. En utilisant la fonction de rappel, le traitement après l'appel de la fonction peut être décrit. J'ai senti que l'exécution de la fonction mise en argument dans la fonction est très différente de java. Si vous décrivez tous les traitements que vous souhaitez effectuer après avoir appelé la fonction dans la fonction de rappel, Il exécutera le traitement dans l'ordre décrit! Enfin, nous avons atteint le stade où nous pouvons l'implémenter avec JavaScript à volonté.
sample04.js
//Définir la fonction A (enregistrer la fonction d'argument dans la file d'attente d'exécution après avoir sorti "aaa")
var A = function(callback) {
console.log('aaa');
callback()
};
//Définir la fonction B
var B = function(callback) {
console.log('bbb');
callback()
};
//Définir la fonction C
var C = function() {
console.log('ccc');
};
//Fonction appelant
function call() {
A(
B(
C()
)
)
};
L'ordre de traitement est le suivant, et l'ordre est le même que Java. Je n'aurais pas dû essayer de faire quelque chose après avoir enregistré la fonction B dans la file d'attente d'exécution de la fonction A. Tout le traitement après l'appel de fonction est décrit dans la fonction appelée ou dans la fonction de rappel de la fonction appelée. A.1 Début de l'exécution de la fonction A ** Sortie "aaa" A.2 ** A.3 Enregistrer la fonction B dans la file d'attente d'exécution A.4 Fin d'exécution de la fonction A B.1 La fonction B lance l'exécution ** Sortie B.2 "bbb" ** B.3 Enregistrer la fonction C dans la file d'attente d'exécution B.4 Fin d'exécution de la fonction B C.1 Exécution de démarrage de la fonction C ** Sortie "ccc" C.2 ** C.3 Fin d'exécution de la fonction C
La fonction de rappel peut également être utilisée pour effectuer le traitement suivant en utilisant la valeur de retour de la fonction. La capacité de passer une fonction comme argument est très différente de Java.
Ensuite, il rencontre l'enfer du rappel.
L'enfer des rappels est maintenant une vieille histoire et peut être évité avec la fonction Promise. L'enfer est fini avec Promise.then (), et vous pouvez facilement contrôler le processus en fonction du résultat de la fonction appelée. En particulier, Promise.all () enregistre la fonction dans la file d'attente d'exécution une fois le traitement de la fonction Promise passée terminée. Vous pouvez également contrôler l'ordre de traitement en appelant une fonction dans une boucle.
(Référence) Essayez d'organiser la synchronisation JavaScript, l'asynchrone, le rappel et les promesses.
Bien que l'inférence de type et la façon d'écrire des fonctions ne soient pas en Java, elles étaient relativement faciles à comprendre, L'ordre de traitement semble être naturel même du point de vue de JavaScript ou des langages de programmation généraux. Il y avait peu d'informations à expliquer. Cela semble être une évidence ………… En tant que personne ne connaissant que Java, ce fut un choc culturel.
Recommended Posts