2011-01-31 14 views
5

Durante la scrittura di codice come questo JSLint lamenta globali implicite:Evitare globali Presenza in javascript (JSLint)

var Test = (function(){ 
    var fnc = function(x){ 
     alert("pew: "+x); 
    }; 

    return { 
     fnc: fnc 
    }; 
}()); 

Test.fnc("hat"); 

(specificamente, 'implicita globale: allarme 4')

Ciò che è considerato il modo corretto per evitare questo? La mia risposta istintiva è questo, ma non sono convinto che sia 'corretta':

var Test2 = (function(global){ 
    var alert = global.alert; 

    var fnc = function(x){ 
     alert("pew: "+x); 
    }; 

    return { 
     fnc: fnc 
    }; 
}(this)); 

Test2.fnc("hat"); 

Edit: Il consenso sembra essere che il problema non è il fatto che sto accedendo a livello globale, è più che non sto dicendo a jslint che cosa sono i globals. Lascerò questo tempo un po 'più lungo per vedere se qualcun altro ha inserito, quindi sceglierò una risposta.

risposta

8

dovete anteporre il file con un commento

/*global alert $ document window*/

Questo è generalmente come dico JSLint che non è implicito, ma esterno.

Questo è sia discreto che dire ai tuoi colleghi programmatori che dichiarare queste variabili come esterne è utile per programmi multi-file più grandi.

+2

IIRC le dichiarazioni dei nomi delle variabili non devono essere separate da virgola? –

+0

@ZackTheHuman c'è spazio separato. Risulta che JSLint dice che la virgola è separata. Ho sempre usato una lista separata di spazi senza errori. Probabilmente gestisce sia – Raynos

+0

Nota che non dovrebbe esserci uno spazio tra l'inizio del commento e 'globale' altrimenti jslint non lo elabora. – oyenamit

0

Credo che il tuo modo è corretto (e buona), ma non v'è alcuna necessità di dichiarare global.alert, basta usare global.alert("pew: "+x);

+0

'var alert = global.alert' è solo per comodità, quindi si comporta allo stesso modo di come sarebbe se avessi lasciato l'errore. – david

+0

Non vedo alcuna comodità usandolo. Ma indipendentemente da questa parte, penso che la tua soluzione non sia solo corretta, è buona. –

1

Per coloro alla ricerca di JSHint invece, c'è l'opzione "browser" che può essere impostato a "true" e gestisce tutti i globals comuni. Lo stesso per "jquery". Ho imparato questo dal gradle-js-plugin source code.

Problemi correlati