312 votes

Que signifie (function($) {})(jQuery); ?

Je commence tout juste à écrire des plugins jQuery. J'ai écrit trois petits plugins mais j'ai simplement copié la ligne dans tous mes plugins sans vraiment savoir ce qu'elle signifie. Quelqu'un peut-il m'en dire un peu plus à ce sujet ? Peut-être qu'une explication me sera utile un jour pour écrire un framework :)

Qu'est-ce que cela fait ? (Je sais que cela étend jQuery d'une manière ou d'une autre, mais y a-t-il autre chose d'intéressant à savoir à ce sujet ?)

(function($) {

})(jQuery);

Quelle est la différence entre les deux façons suivantes d'écrire un plugin :

Type 1 :

(function($) {
    $.fn.jPluginName = {

        },

        $.fn.jPluginName.defaults = {

        }
})(jQuery);

Type 2 :

(function($) {
    $.jPluginName = {

        }
})(jQuery);

Type 3 :

(function($){

    //Attach this new method to jQuery
    $.fn.extend({ 

        var defaults = {  
        }  

        var options =  $.extend(defaults, options);  

        //This is where you write your plugin's name
        pluginname: function() {

            //Iterate over the current set of matched elements
            return this.each(function() {

                //code to be inserted here

            });
        }
    }); 
})(jQuery);

Je peux me tromper et peut-être que tout cela signifie la même chose. Je suis confus. Dans certains cas, este ne semble pas fonctionner dans un plugin que j'ai écrit en utilisant le Type 1. Jusqu'à présent, le type 3 me semble le plus élégant, mais j'aimerais aussi connaître les autres.

23 votes

C'est l'heure du coucher ici, mais juste pour commencer, (function($) { })(jQuery); enveloppe le code de sorte que $ es jQuery à l'intérieur de cette fermeture, même si $ signifie quelque chose d'autre en dehors de lui, généralement à la suite de $.noConflict() par exemple. Cela garantit que votre plugin fonctionne, que ce soit ou non $ === jQuery :)

4 votes

À propos de (function($) { })(jQuery) vous avez dit : "Je sais qu'il étend jQuery d'une certaine manière [...]". Il est clair que vous savez no savoir puisque votre affirmation est 100% fausse. D'ailleurs, elle peut être trompeuse pour les futurs lecteurs. Jetez un coup d'oeil à ceci : stackoverflow.com/a/32550649/1636522 .

0 votes

En prolongement des commentaires de @NickCraver, jquery-ui-1.7.2.custom.min.js utilise ceci par exemple : jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla........})(jQuery) ;. Je sais qu'il s'agit d'une ancienne version de jQuery UI avec un code obsolète, mais le but est de montrer que dans ce cas, ils utilisent "c" au lieu de "$".

11voto

tbranyen Points 2922

Le type 3, pour fonctionner, devrait ressembler à ceci :

(function($){
    //Attach this new method to jQuery
    $.fn.extend({     
        //This is where you write your plugin's name
        'pluginname': function(_options) {
            // Put defaults inline, no need for another variable...
            var options =  $.extend({
                'defaults': "go here..."
            }, _options);

            //Iterate over the current set of matched elements
            return this.each(function() {

                //code to be inserted here

            });
        }
    }); 
})(jQuery);

Je ne sais pas pourquoi quelqu'un utiliserait extend plutôt que de définir directement la propriété dans le prototype jQuery, cela fait exactement la même chose, mais avec plus d'opérations et plus d'encombrement.

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