mi sono imbattuto nel seguente schema quando si guarda attraverso il codice sorgente di SlickGrid:Qual è la ragione per questo modello di chiamata immediata di JavaScript?
(function ($) {
var SlickEditor = {
TextCellEditor: function (args) {
...
},
LongTextCellEditor: function (args) {
...
}
};
$.extend(window, SlickEditor);
})(jQuery);
Se ho capito bene, si sta usando invocazione immediato per definire vari oggetti funzione e poi unirle in namespace globale.
Quindi potrei definire le mie funzioni globalmente in questo modo e avrebbe lo stesso effetto, giusto?
function TextCellEditor (args) {
...
}
function LongTextCellEditor (args) {
...
}
L'unica differenza che posso vedere è che nella prima versione, è possibile utilizzare il $
abbreviata per fare riferimento all'oggetto jQuery
. Oltre a ciò il risultato sarebbe identico in entrambi i casi.
Mi piacerebbe sapere se mi manca qualcosa. Forse c'è un'altra buona ragione per fare le cose in questo modo?
UPDATE: Si noti che l'utilizzo di questo modello di chiamata immediata consente l'utilizzo di variabili private dichiarate nella funzione anonima. Ma non ci sono variabili dichiarate in questo caso e le funzioni vengono comunque iniettate nell'ambito globale. Quindi mi piacerebbe ancora sapere se c'è una vera differenza.
Alcune risposte hanno sottolineato che la referenziazione di variabili locali è molto più rapida rispetto al riferimento a variabili globali. Rimane valido anche se faccio riferimento a $
dal costruttore TextCellEditor()
. $
non è realmente locale a TextCellEditor()
poiché è definito nell'ambito della funzione anonimo esterna.
Tutti i commenti sono graditi.
... L'esempio illustrato inserisce una singola variabile in ambito globale. Inietti più funzioni in ambito globale. C'è un'enorme differenza tra una variabile globale e molte variabili globali – Raynos
@Raynos: Entrambi gli esempi iniettano le stesse funzioni in ambito globale. la chiamata '$ .extend()' estende l'oggetto window con tutte le proprietà di 'SlickEditor' (in questo caso le due funzioni del costruttore). Questo è il punto della mia domanda: qual è la differenza? – njr101
oh aspetta, non mi ero reso conto che l'autore di SlickEditor era un idiota e ha iniettato tutte le funzioni in ambito globale. Questo è un modello anti, entrambi i campioni di codice sono una cattiva pratica. – Raynos