10
votes

Pourquoi ce groupe opérateur + fonction est-il immédiatement invoqué?

Je suis d'étudier le comportement des expressions de fonction immédiatement invoquées (IIFE) et tout en faisant que j'ai rencontré la situation suivante.

(function () {
    document.write("bar");
})

var x = 1;

(function () {
    document.write("foo");
}());


1 commentaires

Conseil: Utilisez JSHINT.COM


3 Réponses :


16
votes

Parce que vous avez oublié le point-virgule après la première expression de fonction: xxx

sinon le deuxième "opérateur de regroupement" est interprété comme un appel de la fonction. Donc, ceci: xxx

est fondamentalement identique à celui de: xxx

la réorganisation est un peu plus facile à voir. N'oubliez pas que les caractères d'espace blanc n'ont aucune signification en JavaScript et sont ignorés.


0 commentaires

4
votes

Comme Felix Kling a correctement noté: le point-virgule manquant provoque l'interprétation des parenthèses autour des parenthèses autour de la seconde que l'appel de fonction soit plutôt que de regrouper l'expression de la fonction. Il devient beaucoup plus clair sans les nouvelles lignes: xxx

ou avec un certain réalignement: xxx

La première expression de fonction est appelée à la suite de la deuxième expression de fonction comme son premier et unique argument. Vous devriez également noter que foobar est écrit plutôt que Barfoo , car la deuxième fonction est appelée en premier et son résultat est transmis comme un argument à la première fonction.


0 commentaires

3
votes

Vous pouvez écrire un ife aussi comme celui-ci: (fonction () {}) () code>

En omettant le point-virgule, votre premier codeNippet appelle en réalité la première fonction avec la deuxième fonction de la livraison en tant que paramètre pour le premier. p> xxx pré>

quel premier impression foo code> puis bar code> Contrairement à: p>

(function () {
    document.write("bar");
});

(function () {
    document.write("foo");
}());


0 commentaires