JSLint-Fehler: Unerwarteter 'dieser'
Schwierigkeiten zu verstehen, warum JSLint ist überrascht von meinem Einsatz von this
im folgenden code:
JS:
function testConstr (x) {
'use strict';
this.joker = "Whyyy sooo seriousss?";
this.x = x;
}
Sowohl property-Zuweisungen, JSLint sagt: Unerwartete 'diese'. Wie kann ich richtige mein code?
- Ihre
this
ist nicht unbedingt schlecht. IsttestConstr
als einen Konstruktor? Nennen Sie es mitcall
oderapply
? - Wenn Sie finden, JSLint-zu viele beliebige Warnungen, die Sie wollen, zu schauen, JSHint.
- Was passiert, wenn Sie nutzen es, um
TestConstr
? Funktioniert die Warnung bleiben? - Yep, das war meine erste Entscheidung. Immer noch kaputt. Die neue JSLint will Sie ermutigen, zu stoppen, mit
this
insgesamt. Ich meine, zugegeben, der Umfang ist wirklich eine der verwirrendsten Themen für neue (und alte!) JavaScript-Programmierer, aber ich weiß nicht, ob das ist Grund genug, ein Verbot dessen Verwendung standardmäßig an. Seine Grundprinzip ist "Mitthis
in der Sprache erschwert das sprechen über die Sprache". Das ist nicht falsch, denke ich. Wahrscheinlich lohnt sich der Versuch für eine Weile. - JSLint bietet jetzt eine option zum unterdrücken dieser Beschwerde. Bitte siehe meine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihren code könnte vollkommen korrekt (es könnte auch problematisch sein, je nachdem, wie Sie Sie nennen
testConstr
).Mein Vorschlag: sagen Sie JSLint zu shut up
Oder nicht verwenden JSLint überhaupt.
new
Schlagwort (d.h. als Objekt-Konstruktor). Sorry, wenn das war nicht klar. Also in anderen Worten, JSLint nicht automatisch erwarten, dass mich ein Konstruktor-pattern? Nicht hilfreich für nubes wie mich . . .new
es sollte vollkommen in Ordnung. JSLint ist mehr als paranoid.Wissen Sie, ich glaube, du hast Recht. Ihre Frage nervte mich, und ich habe mich für Crockford ' s JSLint Diskussion Gruppe und gefragt. Er antwortete, aber ignoriert die Lösung, die ich vorstelle, weiter unten, die ich denke bedeutet, dass es okay ist, auf die gleiche Weise JSLint nicht beschweren, wenn etwas vergeht aufbringen.
(ich warte immer noch auf eine aktualisierte Gute Teile, obwohl.)
Diesem VORBEHALT beiseite, hier ist was ich vorschlagen würde zu tun für OO-JavaScript, dass geht Beta JSLint (bis heute jedenfalls).
Werde ich umschreiben, ein Beispiel von MDN ' s Seite, "Einführung in die objektorientierte Programmierung," die selbst verwendet
this
liberal.Mit
this
Hier ist das original, unlinted MDN-Beispiel aus dem Abschnitt " verknüpfte, oben:
Folgt, dass die Konventionen, die wir kennen und lieben.
Ohne
this
Ist es ziemlich einfach, herauszufinden, wie man "Konstrukteure", die nicht Folgen, dass die Muster, aber wir verlieren die Verwendung von
prototype
, wenn ich mich nicht etwas fehlt, und haben alle mit den Methoden eines Objekts in unser Konstruktor, wollen wir alle unsererPeep
s zu teilen.So gibt es eine lintable alternative. Das bedeutet, andere als die
return peep;
und die innere definition von Methoden, machen JavaScript zu handeln, wie viele OO-Sprachen, die Sie stoßen könnten. Es ist nicht falsch, mindestens.Keinen Zugang zu
prototype
ist nicht schrecklich; es ist wirklich eine schlechte Nachricht zu ändernprototype
irgendwo, dass ist nicht direkt neben dem Konstruktor, als würde der code gehen Sie zu spaghetti. "EinigePerson
s habensayGoodbye()
und einige nicht, je nachdem, ob wir würden geändert, das Vorbild an dem Punkt Ihrer Konstruktion." Das ist schrecklich. Also diese alternative Konvent hat seine Vorteile.Können Sie immer noch, natürlich, hinzufügen von Funktionen zu einer einzigen Instantiierung
Peep
später, aber ich bin mir nicht sicher, wie Sie würde den ZugangfirstName
ohne Verwendungthis
, also vielleicht will er uns zu stoppen munging Objekte nach dem Bau.(Ich meine, wir könnten auch noch monkey-patch
Peep
zu ändern Mitte-Prozess, aber es ist schrecklich, dumm Programmierung. In der Regel.)Vererbung (ohne
this
)- Und Erbrecht ist einfach genug, denke ich.
EDIT: Siehe auch diese Antwort, wo der Fragesteller später gefunden Crockford vorgeschlagenen Mittel zur Erstellung von OO-javascript. Ich bin versucht, Sie zu überzeugen, dass guy zu löschen, die Q&A und bewegen Sie den Ein hier. Wenn er das nicht tut, werde ich wohl hinzufügen, seine Sachen und community wiki hier.
EDIT: Sehen diese von MDN, warum es funktioniert:
In einem strikten Modus
this
Referenz festgelegt istundefined
.So dass beide Ihre Aussagen verursachen, Lesen der Eigenschaften der
undefined
Objekt, die zu einer Ausnahme führen.Entfernen Sie die beiden Linien.
UPD: was ich Staat oben ist, wie JSLint behandelt dein code, nicht, wie ich das tun.
this
bezieht sich aufwindow
einewindow.joker
undwindow.x
ist auch möglich... es sei denn, diethis
bezieht sich auf ein Ereignis, das Ziel oder so...testConstr
heißttestConstr()
. Seinen Namen gegeben, es kann nicht der Fall sein.this
option ist neu in JSLint-beta, die nur ein paar Wochen alt. Ich bin ein wenig enttäuscht zu. Ich meine, Crockford ' s Kommentar, dass, "[Mitthis
] ist wie pair programming mit Abbott und Costello" ist nicht wirklich hilfreich für den Hinweis auf das, was ist best practice in genau diese situation. Ich gebe der beta den Vorteil des Zweifels für jetzt, sondern beachten Sie, dass der original-code, wie geschrieben, Fusseln in old.jslint.com nur mit dem "chaotisch" white space" - Direktive auf true gesetzt. Also weniger böse, im letzten Monat.Gibt es keine Notwendigkeit, um korrekte code.
In der Hilfe-Seite für JSLint, in dem Abschnitt, der für die
/*jslint*/
Richtlinie, eine "Tolerierenthis
" - option wurde Hinzugefügt, um die Tabelle der verfügbaren Optionen:So, zum unterdrücken von Beschwerden über die Verwendung von
this
, platzieren Sie die folgende Anweisung in der Quelldatei vor der ersten Anweisung:(Beachten Sie, dass andere
/*jslint*/
Optionen Folgen kannthis
durch einfügen eines Kommas zwischen den Optionen. Finden Sie die JSLint-Hilfe-Seite.)Siehe auch die Antwort von @Oriol zu ermöglichen, die "Tolerieren
this
" option in der Benutzeroberfläche für JSLint.Eine alte Frage, ich weiß, aber falls es hilft jemand, ich war gerade ein sprechen von Douglas Crockford, in dem er sagt (ungefähr 23mins), dass er nahm es heraus, weil einem Angreifer das ausführen einer Methode eine Funktion und erhalten Zugang zu den globalen Bereich mit der "this" - Schlüsselwort.
Er sagt, es bedeutete auch nicht mit dem Objekt.erstellen Sie mehr - eine Funktion, die er half bei der Einführung in die Sprache!