C'est généralement l'espace de noms (voir plus loin) et le contrôle de la visibilité des fonctions de membre et/ou des variables. Pensez-y comme à une définition de l'objet. jQuery plugins sont généralement écrites comme ceci.
En Javascript, vous pouvez imbriquer des fonctions. Donc, la suivante est valide:
function outerFunction() {
function innerFunction() {
// code
}
}
Maintenant, vous pouvez appeler outerFunction()
, mais le visiblity d' innerFunction()
est limitée à la portée de outerFunction()
, c'est à dire privé d' outerFunction()
. Essentiellement, il suit le même principe que les variables en Javascript:
var globalVariable;
function someFunction() {
var localVariable;
}
En conséquence:
function globalFunction() {
var localFunction1 = function() {
//I'm anonymous! But localFunction1 is a reference to me!
};
function localFunction2() {
//I'm named!
}
}
Dans le scénario ci-dessus, vous pouvez appeler globalFunction()
à partir de n'importe où, mais vous ne pouvez pas appeler localFunction1
ou localFunction2
.
Ce que vous faites lorsque vous écrivez (function() { ... code ... })()
, c'est que vous êtes du code à l'intérieur d'une fonction littérale (le sens de l'ensemble de "l'objet" est en fait une fonction). Après cela, vous êtes auto-invocation de la fonction (le final ()
). Donc, l'avantage majeur de cette comme je l'ai mentionné avant, est que vous pouvez avoir privé des méthodes/fonctions et propriétés:
(function() {
var private_var;
function private_function() {
//code
}
})()
La chose intéressante est que vous pouvez également définir les choses à l'intérieur et à l'exposer au monde extérieur (un exemple de namespacing de sorte que vous pouvez créer votre propre bibliothèque/plugin):
var myPlugin = (function() {
var private_var;
function private_function() {
}
return {
public_function1: function() {
},
public_function2: function() {
}
}
})()
Maintenant, vous pouvez appeler myPlugin.public_function1()
, mais vous ne pouvez pas accéder private_function()
! Donc, assez semblable à une définition de classe. Pour mieux comprendre ce processus, je vous recommande les liens suivants pour certains plus de lecture:
MODIFIER
J'ai oublié de mentionner. Dans cette dernière ()
, vous pouvez passer tout ce que vous voulez à l'intérieur. Par exemple, lorsque vous créez des plugins jQuery, vous passez en jQuery
ou $
comme:
(function(jQ) { ... code ... })(jQuery)
Donc, ce que vous faites ici est de définir une fonction qui prend un paramètre (appelé jQ
, une variable locale, et connu seulement à cette fonction). Alors vous êtes auto-invocation de la fonction et en lui passant un paramètre (également appelés jQuery
, mais c' est à partir du monde extérieur et une référence à la réalité de jQuery). Il n'y a aucune urgence à le faire, mais il ya certains avantages:
- Vous pouvez redéfinir un paramètre global et de lui donner un nom qui fait sens dans la portée locale.
- Il y a un léger avantage en termes de performances, car il est plus rapide de chercher des choses dans la portée locale au lieu d'avoir à marcher jusqu'à la portée de la chaîne dans la portée globale.
- Il ya des avantages pour la compression (minification).