JavaScript vu de Java

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.

Où confus

  1. Inférence de type
  2. Comment écrire une fonction
  3. Traitement de la commande
  4. Rappel

1. Inférence de type

Vous pouvez déclarer n'importe quelle variable avec "var". Les variables peuvent contenir des ** fonctions ** ainsi que des valeurs.

2. Comment écrire une fonction

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.

Fonction anonyme

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);

Fonction immédiate

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);

3. Traitement de la commande

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.

JavaScript est un thread unique

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?

L'unité d'exécution de JavaScript est une fonction

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?

4. Rappel

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.

Fonction de 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.

Fonction de promesse

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.

Résumé

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

JavaScript vu de Java
La route de JavaScript à Java
Appel de méthodes Java à partir de JavaScript exécutées en Java
Java et JavaScript
Appeler Java depuis JRuby
Changements de Java 8 à Java 11
Somme de Java_1 à 100
Évaluer la source Java à partir de Java
Accédez à API.AI depuis Java
De Java à Ruby !!
Migration de Cobol vers JAVA
Essayez d'appeler JavaScript en Java
Java à partir du débutant, remplacer
Création d'index Elastic Search à partir de Java
Nouvelles fonctionnalités de Java7 à Java8
Connectez-vous de Java à PostgreSQL
Java, instance à partir du débutant
La vie Java à partir de zéro
Utilisation de Docker depuis Java Gradle
De Java inefficace à Java efficace
Exécuter des instructions non-Java à partir de Java
Appeler la classe scellée de Kotlin depuis Java
Java, classe abstraite pour commencer par débutant
Coder Java depuis Emacs avec Eclim
Deep Learning Java from scratch 6.4 Régularisation
Java, JavaScript, C # (différence d'affectation)
Déléguer certains traitements Java à JavaScript
Exécutez node.js depuis Android Java (traitement)
Évitez le calendrier Java autant que possible
[Java] Supprimer les espaces dans les chaînes de caractères
Procédure de préparation pratique d'Akka à partir de Java
Accéder à Teradata depuis une application Java
Note 1: Elémentaire, pierres d'achoppement (java, javascript)
Utiliser Chrome Headless de Selenium / Java
De Java à VB.NET - Écriture de notes de contraste
Java, constructeur de surcharge à partir du débutant
Travailler avec des feuilles de calcul Google à partir de Java
Java, interface pour partir du débutant
À propos de l'environnement Eclipse (Java, Liberty, JavaScript)
Réintroduction de Java8, disponible depuis Android Studio 2.4
Appelez l'API Java de TensorFlow depuis Scala
[Java] Conversion d'un tableau à une liste
Exemple de code utilisant Minio de Java
JSON en Java et Jackson Part ③ Incorporer JSON dans HTML et l'utiliser à partir de JavaScript