Frage

In Google Closure Compiler Ich erhalte die Warnung

  

ACHTUNG - gefährlich Verwendung des globalen dieses Objekts

Hier ist ein Beispiel. Die Fehlerleitung und Offset bezieht sich auf den Anfang des Wortes this

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

Ich würde es nur zu einer anonymen Methode ändern, aber ich bin wieder mit aToggle an anderer Stelle in der Datei, so dass es benannt werden muss.

kann ich aToggle als /**@constructor*/ markieren - aber es ist kein Konstruktor. Gibt es eine andere Anmerkung ich verwenden kann, um diese Warnung zu beseitigen, oder bin ich zwischen Markierung als Konstruktor oder mit einem Bündel von nutzlosen Warnungen steckte auftauchen?

War es hilfreich?

Lösung

Bearbeiten : Ich habe gelesen, Verschluss: The Definitive Guide, und ich erkennen, dass man einfach die /** @this {Element} */ Anmerkung vor Ihrem Event-Handler-Closure Compiler Stop beschweren zu machen.

Sehen Sie die Closure Compiler Warnhinweis . Der Closure Compiler gibt diese Warnung, wenn Sie this innerhalb einer Funktion verwenden, die nicht entweder /** @constructor */ kommentiert wird oder innerhalb der prototype einer Klasse. Der Compiler geht davon aus, dass Sie nie this verwenden werden, wenn eine Funktion im Rahmen eines anderen Objekts aufgerufen wird (das ist, was Ereignisrückrufe tun).

Einige Orte, die Sie ändern müssen möglicherweise Closure Compiler Stop beschweren mit dieser Warnung zu machen:

  • Do link.onclick = ... nicht direkt verwenden, weil Sie zu Chaos mit this und e || window.event haben. Verwenden Sie stattdessen jQuery den Event-Handler zu wickeln, da jQuery Ereignisobjekt verfügt über e.currentTarget .
  • Wenn Sie mit this innerhalb eines jQuery.each, ersetzt this mit dem zweiten Parameter Ihrer Funktion. Z. B. jQuery.each([1, 2, 3], function(i, val) { ... val ... };.

Andere Tipps

Ich weiß nicht, JQuery sehr gut, aber ich denke, Sie so etwas wie verwenden kann:

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

, wo Sie das klickten Ziel von einem Cross-Browser-generic Ereignisobjekt abgerufen werden.

EDIT:. Als Wort der Beratung, Verwendung { } mit Ihrem if else und Verwendung Semikolons, nicht auf Ihrem Browser setzt es für Sie tun

Um die optimale Nutzung der Schließwerkzeuge machen es ratsam, die Schließung Bibliothek in Kombination mit dem Compiler zu verwenden (wenn auch nicht erforderlich)

Zuerst Sie tun es wahrscheinlich falsch. : -)

@Jan hatte die richtige Idee. Aber Sie sollten wahrscheinlich mit folgenden gehen:

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

und beim Kompilieren:

Verwenden Sie die folgende jQuery Externen-Datei, die Closure Compiler sagt, was das tut, was in jQuery: http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs. js

Wenn Sie nur die Warnmeldung wollen weg gehen, ersetzen this mit link.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top