2010-10-27 11 views
8

En Google Closure Compiler tengo la advertenciaADVERTENCIA - El uso peligroso de lo global este objeto

ADVERTENCIA - El uso peligroso de lo global este objeto

Este es un ejemplo. La línea de error y el desplazamiento se refiere al principio de la palabra this

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

me acaba de cambiar a un método anónimo, pero estoy reutilizando aToggle en el archivo en otro lugar, por lo que debe ser identificado.

Pude marcar aToggle como - pero no es un constructor. ¿Hay alguna otra anotación que pueda utilizar para eliminar esta advertencia, o estoy atrapado entre marcarlo como constructor o tener un montón de advertencias inútiles?

+0

Ok, es fácil de hacer. De todos modos: 'shown' and' toggle' es global? No he usado Google Closure Compiler, pero probablemente no sepa que su aToggle es un controlador de eventos. Vea si hay algún lugar donde pueda decirlo, porque entonces 'this' no es necesario, el' this' global. – some

+0

Sí, estoy usando aToggle en otros lugares. El código anterior es solo un ejemplo que escribí. –

Respuesta

13

Editar: He estado leyendo Cierre: La guía definitiva, y sólo se dio cuenta de que sólo tiene que añadir el /** @this {Element} */ annotation antes de que su controlador de eventos para hacer Cierre Compilador detener las protestas.

Ver el Closure Compiler warning reference. El compilador de cierre proporciona esta advertencia cuando usa this dentro de una función que no tiene la anotación /** @constructor */ o está dentro del prototype de una clase. El compilador asume que nunca usará this cuando se invoca una función en el contexto de otro objeto (que es lo que hacen las devoluciones de llamada de evento).

Algunos de los lugares que puede que tenga que cambiar para que Closure Compiler dejar de quejarse con esta advertencia:

  • no utilice link.onclick = ... directamente, porque hay que meterse con this y e || window.event. En su lugar, use jQuery para ajustar el controlador de eventos, ya que jQuery's event object has e.currentTarget.
  • Si está usando this dentro de un jQuery.each, reemplace this con el segundo parámetro de su función. Por ejemplo, jQuery.each([1, 2, 3], function(i, val) { ... val ... };.
1

No sé jQuery muy bien, pero creo que se puede usar algo como:

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); 

donde se recupera el blanco se ha hecho clic de un objeto de evento genérico cruz navegador.

EDITAR: como consejo, use { } con su if else y use punto y coma, no confíe en que su navegador lo haga por usted.

para hacer el mejor uso de las herramientas de cierre se aconseja utilizar la biblioteca de cierre en combinación con el compilador (aunque no es necesario)

+0

¿Por qué día debo usar llaves y puntos y comas? –

+0

'should' es quizás un poco fuerte, pero las llaves realmente mejoran la legibilidad de los programas donde se usa para agrupar el código. Semicolon: http://stackoverflow.com/questions/444080/do-you-recommend-using-semicolons-after-every-statement-in-javascript. Pero más importante aún, ¿mi solución funciona para usted? – Jan

+0

Aún no lo he probado, me han trasladado a otros proyectos, pero no olvidaré volver a aceptar la respuesta correcta. Miré el compilador y realmente quita los frenos y agrega los puntos y comas, lo cual es bueno. Gracias por mencionarlo. –

1

En primer lugar, es probable que esté haciendo mal. :-)

@Jan tuvo la idea correcta. Pero probablemente debería ir con lo siguiente:

(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(); 
    }); 
}()); 

y al compilar:

Usar el siguiente fichero externo jQuery que le dice Cierre compilador lo hace qué en jQuery: http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs.js

Si lo que desea es la mensaje de advertencia para irse reemplazar this con link.

+0

Hay un archivo externo actualizado http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs.js –

+0

Estoy usando una lista en otros lugares, así que no puedo simplemente reemplazar 'this' con' link'. El código anterior es solo un ejemplo que escribí. Gracias por la respuesta, lo intentaré pronto. –

+0

@GeorgeBailey Ah, no revisé una actualización. Había pasado tanto tiempo desde la versión 1.3.2 que pensé que nunca se actualizaría. Actualizaré mi respuesta. –

Cuestiones relacionadas