2010-10-27 12 views
8

In Google Closure Compiler ottengo l'avvertimentoATTENZIONE - uso pericoloso del mondiale questo oggetto

ATTENZIONE - uso pericoloso del mondiale questo oggetto

Ecco un esempio. La linea di errore e l'offset si riferisce all'inizio della parola this

function aToggle() { 
    if(shown) 
    toggle.show() 
    else 
    toggle.hide() 
    $(this).text(shown ? 'Click to hide' : 'Click to show') 
    shown = !shown 
} 
link.onclick = aToggle 

vorrei solo cambiare a un metodo anonimo, ma sono riutilizzando aToggle altrove nel file, quindi ha bisogno di essere nominato.

mi potrebbe segnare aToggle come /**@constructor*/ - ma non è un costruttore. C'è un'altra annotazione che posso usare per eliminare questo avvertimento, o sono bloccato tra la marcatura come costruttore o l'apparizione di un mucchio di avvertimenti inutili?

+0

Ok, è facile da fare. Comunque: 'shown' e' toggle' è globale? Non ho usato Google Closure Compiler, ma probabilmente non so che il tuo aToggle è un gestore di eventi. Vedi se c'è un punto in cui puoi dirlo, perché allora "questo" non è necessario il globale "questo". – some

+0

Sì, sto usando unToggle in altri posti. Il codice sopra riportato è solo un esempio che ho scritto. –

risposta

13

Edit: Ho letto di chiusura: The Definitive Guide, e ho appena capito che si può semplicemente aggiungere il /** @this {Element} */ annotation prima che il gestore di eventi per fare smettere di chiusura Compiler lamentarsi.

Vedere Closure Compiler warning reference. Il Closure Compiler fornisce questo avviso quando si utilizza this all'interno di una funzione che non è annotata /** @constructor */ o è all'interno di prototype di una classe. Il compilatore presuppone che non si userà mai this quando una funzione viene chiamata nel contesto di un altro oggetto (che è ciò che fanno i callback dell'evento).

Alcuni luoghi che si potrebbero avere a cambiare per fare smettere Chiusura Compiler lamentarsi con questo avvertimento:

  • non utilizzare link.onclick = ... direttamente, perché si ha a pasticciare con this e e || window.event. Invece, usa jQuery per avvolgere il gestore di eventi, dal jQuery's event object has e.currentTarget.
  • Se stai usando this all'interno di un jQuery.each, sostituire this con il secondo parametro della funzione. Ad esempio, jQuery.each([1, 2, 3], function(i, val) { ... val ... };.
1

Non so JQuery molto bene, ma penso che si può usare qualcosa come:

function aToggle(event) { 
    if(shown) { 
    toggle.show(); 
    } else { 
    toggle.hide(); 
    } 
    $(event.target).text(shown ? 'Click to hide' : 'Click to show'); 
    shown = !shown; 
} 

$(link).bind('click', aToggle); 

in cui si recupera il bersaglio cliccato da un oggetto evento generico cross browser.

MODIFICA: come parola di consiglio, utilizzare con il numero if else e utilizzare il punto e virgola, non fare affidamento sul browser per farlo per voi.

di fare il miglior uso degli strumenti di chiusura si consiglia di utilizzare la libreria di chiusura, in combinazione con il compilatore (anche se non necessario)

+0

Perchè giorno hai bisogno di usare parentesi graffe e punto e virgola? –

+0

'should' è forse un po 'forte ma le parentesi graffianti migliorano davvero la leggibilità dei programmi in cui è utilizzato per raggruppare il codice. Punto e virgola: http://stackoverflow.com/questions/444080/do-you-recommend-using-semicolons-after-every-statement-in-javascript. Ma ancora più importante, la mia soluzione funziona per te? – Jan

+0

Non l'ho ancora testato, sono stato spostato in altri progetti ma non dimenticherò di tornare ad accettare la risposta giusta. Ho guardato il compilatore e in realtà toglie le parentesi graffe e aggiunge il punto e virgola, che è bello. Grazie per averlo menzionato. –

1

In primo luogo, si sono probabilmente facendo male. :-)

@Jan ha avuto l'idea giusta. Ma probabilmente si dovrebbe andare con il seguente:

(function(){ 
    var toggle = $("#toggle"); 
    $("#yourLinksID, .orClassName").click(function(e) { 
     var shown = toggle.toggle().is(":visible"); 
     $(this).html(shown ? "Click to hide" : "Click to show"); 
     e.preventDefault(); 
    }); 
}()); 

e durante la compilazione:

utilizzare il seguente file esterni jQuery che racconta Chiusura Compiler cosa fa che cosa in jQuery: http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs.js

Se si desidera solo il messaggio di avviso per andare via sostituire this con link.

+0

Esiste un file externs aggiornato http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs.js –

+0

Sto usando aToggle altri posti quindi non posso semplicemente sostituire 'questo' con' link'. Il codice sopra riportato è solo un esempio che ho scritto. Grazie per la risposta, ci proverò presto. –

+0

@GeorgeBailey Ah, non ho controllato l'aggiornamento. Era passato tanto tempo da quando la versione 1.3.2 pensavo che non sarebbe mai stata aggiornata. Aggiornerò la mia risposta –

Problemi correlati