WARNUNG - gefährliche Nutzung des globalen dieses Objekt
-
26-09-2019 - |
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?
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 mitthis
unde || window.event
haben. Verwenden Sie stattdessen jQuery den Event-Handler zu wickeln, da jQuery Ereignisobjekt verfügt übere.currentTarget
. - Wenn Sie mit
this
innerhalb einesjQuery.each
, ersetztthis
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
.