2010-11-16 3 views
2

Je vois des plug-ins JQuery et autres javascript documents de bibliothèque créés comme celui-ci:compréhension de l'aide javascript convention

(function($,window,undefined){ 
    ...plug-in code... 
}); 

Pourquoi est-il nécessaire d'envelopper le script dans une fonction, et ce args ne peut que la fonction de réception ?

Répondre

1

La seule portée dans Javascript autre que globale, est la portée de fonction. Envelopper un bloc de code dans une fonction est la seule façon de s'assurer que vos variables ne fuient pas dans le reste du code

La seule façon dont cette fonction peut recevoir des arguments est si elle est appelée dès qu'elle est définie (en fait, c'est la seule façon dont cette fonction aura jamais son code exécuté):

(function($,window,undefined){ 
    ...plug-in code... 
})(jQuery,this,...); 
1

la raison en est dans la doc:

pour vous assurer que votre plugin ne entrer en collision avec d'autres bibliothèques qui pourraient utiliser le dollar signe, c'est une meilleure pratique pour passer jQuery à une fonction d'exécution (fermeture) qui mappe au signe dollar, donc il ne peut pas être écrasé par une autre bibliothèque dans la portée de son exécution.

Lire ici: http://docs.jquery.com/Plugins/Authoring

6

Les args reçus sont:

(function($,window,undefined){ 
    //.. 
})(jQuery, window); 

$: Une référence pour l'objet jQuery, souvent fait pour pouvoir s'y référer comme les $ alias , puisque dans la portée externe, le code peut être en "mode de compatibilité".

window: L'argument window est souvent utilisé pour réduire identificateur recherche. Dans les scripts de navigateur window est une propriété de l'objet global, afin de le résoudre, le processus de résolution d'identificateur doit inspecter chaque portée, jusqu'à ce qu'il atteigne la portée globale. Si nous ajoutons window comme argument, la recherche sera courte, quelle que soit l'imbrication de notre fonction.

Dans les environnements de script non-navigateur, l'identifiant window n'existe même pas, et ce modèle est une façon courante de garder une trace de l'objet global, par exemple:

(function (global, undefined) { 
    //.. 
})(this); 

Notez que la valeur this pour code global (pas le code de fonction), fait toujours référence à l'objet global.

undefined: Enfin, mais non le moindre, l'argument undefined, il est utilisé comme une « mesure de sécurité », car undefined est également une propriété de l'objet global, et dans la ECMAScript 3e édition Spécification, sa valeur est mutable, Immagine:

undefined = true; 

ce serait gâcher votre code, mais si nous avons un argument, et nous ne transmettons pas rien, il tiendra la valeur indéfinie . Heureusement cela a été fixé sur la spécification ECMAScript 5th Edition, undefined, Infinity et NaN ne sont plus inscriptibles. :)

+0

wow, je n'avais aucune idée du bit non défini là. étrange que indéfini est mutable. – Matt

+0

'typeof myVar ==" undefined "' est à peu près la comparaison la plus sûre à utiliser, mais il est bon que cette mesure de sécurité soit en place. – Gareth

+0

@Matt, Ouais, était quelque chose de mal sur ECMAScript 3, 'undefined' n'est pas un * Literal * comme' null', 'true' ou' false', est une propriété inscriptible de l'objet global :( – CMS