27 votes

!function(){ }() vs (function(){ })()

En examinant une partie du code écrit dans le Javascript de Twitter Bootstrap, il semble qu'ils appellent des fonctions anonymes immédiatement invoquées comme ceci :

!function( $ ) {

     ...

}(window.jQuery || window.ender);

Où j'ai traditionnellement vu cette même chose accomplie de cette façon :

(function($) {

    ...

})(window.jQuery || window.ender);

La première méthode semble un peu compliquée, et je ne suis pas sûr qu'il y ait un avantage ou une raison de procéder de cette façon plutôt que de la seconde ? Notez que je comprends comment cela fonctionne, je cherche à comprendre pourquoi ils ont choisi cette façon de faire.

18voto

alex Points 186293
  • Un caractère de moins lors de la minification.
  • En ! doit gérer les cas où un autre code JavaScript est concaténé avant celui-ci et ne comporte pas de point-virgule de fin.

Il n'y a pas une grande différence. J'utiliserais ce avec quoi vous êtes le plus à l'aise. Vous devriez probablement jeter quelque chose au début de votre exemple pour éviter...

base.js

var lol = function() {
   alert(arguments[0]);
}

im-concat-to-base.js

(function() {
    // Irrelevant.
})();

jsFiddle .

Ajoutez-y un chef de file ; et elle travaille...

jsFiddle .

...ou un ! comme le Twitter Bootstrap...

jsFiddle .

13voto

Pointy Points 172438

Ce sont deux façons de dépasser l'ambiguïté de la grammaire. Aucune n'est plus "bidouilleuse" que l'autre. C'est juste un choix de style.

Vous pouvez aussi faire ça :

0 + function( $ ) {
  // ...
} ( window.jQuery || window.ender );

Ou :

parseInt(function( $ ) {
  // ...
} ( window.jQuery || window.ender ) );

1voto

Une réponse que je n'ai pas encore vue est qu'elle évite d'entourer toute votre fonction de parenthèses. En dehors des considérations esthétiques, cela peut être un plus pour certains éditeurs qui utilisent les parenthèses pour déterminer le niveau d'indentation d'une ligne.

1voto

Jack Points 88446

Au lieu de l'étape d'évaluation de !undefined vous pourriez également utiliser le void pour lever l'ambiguïté :

void function($) {
     ...
}(window.jQuery || window.ender);

Il a une sorte de qualité C ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X