2015-05-27 9 views
11

Sto scrivendo il mio primo plug-in jQuery, e non sono del tutto sicuro di cosa dovrebbe essere all'interno della dichiarazione di estensione e cosa non dovrebbe essere dovuto a.Le funzioni dovrebbero essere all'interno o all'esterno di jQuery?

$.fn.myplugin = function() { 
    var somevar = this; 
    someFunc(somevar); 
}; 
function someFunc() {/*doSomethin'*/}; 

O

$.fn.myplugin = function() { 
    var somevar = this; 
    someFunc(somevar); 
    function someFunc() {/*doSomethin'*/}; 
}; 
+0

ovviamente il problema con il primo è che se lo si utilizza in un nuovo progetto, è necessario assicurarsi di aver già definito 'someFunc()', il che significa che renderlo come un plugin non lo farà raggiungere molto. certamente? –

+0

@JoshStevenson Ho assunto che l'intera operazione andasse in un singolo file, ad es. 'myplugin.jquery.js' nel qual caso non importa, giusto? –

+3

Come nota a margine, il tuo plugin dovrebbe restituire il set di elementi corrispondenti per mantenere il jQuery chaining –

risposta

9

userei la prima opzione perché:

Non ha effetti collaterali negativi.

Ecco dove ti sbagli. Se stai lavorando con diverse librerie, rischi di sovrascrivere qualcuno e qualcun'altroFunc(), probabilmente rompendo qualsiasi cosa stessero tentando di fare per te. Un modo più sicuro sarebbe quello di avvolgere una chiusura attorno al tuo codice.

(function(){ 

$.fn.myplugin = function() { 
    var somevar = this; 
    someFunc(somevar); 
}; 

function someFunc() {/*doSomethin'*/}; 

/* Do whatever other things you need someFunc/myplugin for */ 

})(); 

In questo modo someFunc è protetto dallo spazio dei nomi globale.

In alternativa ciò che si potrebbe desiderare di fare è esporre il metodo dell'oggetto al mondo esterno. Prendete esempio seguente:

$.fn.dog = function() { 

    this.bark = function() {alert("Woof");}; 

    return this; 
}; 

var $max = new $('#myDogMax').dog(); 
$max.bark(); 

questo mantiene la funzione nel contesto del vostro oggetto, ma permette di accedervi in ​​modo pulito dall'esterno. Anche se questo di solito significa che il metodo è in qualche modo correlato all'oggetto. Non avrebbe molto senso scrivere una funzione di bark() globalmente, dato che di solito sono i cani che lo fanno e non le finestre del browser.

5

Nel tuo primo metodo, si finisce per inquinare la portata globale aggiungendo someFunc(). Il secondo metodo no.

Tuttavia, ciò non significa automaticamente che il secondo metodo è migliore. Se si racchiude il primo metodo in una chiusura, fondamentalmente finisce per essere esattamente la stessa cosa, e si riduce alle preferenze personali.
Qui, potrebbe anche essere preferibile utilizzare il primo metodo (in una chiusura), in modo che se si dispone di più estensioni jQuery in un singolo file JS, possono condividere questa funzione di base.

+0

Se l'OP ha creato questo plugin con la funzione in una lib personale, è possibile verificare se esistesse prima di ridefinirlo nel plug-in. In questo modo userebbe la funzione di ambito globale quando il plug-in può e semplicemente lo creerà all'interno del plugin se non può – SidOfc

+0

@SidneyLiebrand Se la funzione è specifica del metodo plugin, dovrebbe essere definita all'interno del plugin, altrimenti su qualsiasi outter scope, a seconda use case –

+0

Avete ragione al riguardo! – SidOfc

Problemi correlati