Ja, ja, ich weiß, strikter Modus ist noch nicht da, aber ich plane wirklich für die Zukunft ...
Also, warum ist das:
%Vor%... im ES5 Strict-Modus nicht erlaubt?
Oder interpretiere ich das falsch? JSLint:
%Vor%Könnte es ein wenig ausführlicher sein, frage ich mich ...?
BEARBEITEN:
Um Verwirrung zu vermeiden, ist hier mehr vom ursprünglichen Code:
%Vor%Einige Versuche und Fehler dieses Codes in JSLint
%Vor% zeigt mir, was falsch ist: Sie verwenden this
als Parameter. Wenn Sie this
es auf that
s ändern, wird der Fehler nicht ausgelöst.
Wie die Spezifikation sagt:
Wenn dies im strikten Moduscode ausgewertet wird, wird der Wert this nicht für ein Objekt erzwungen. Ein dieser Wert von null oder undefined wird nicht in das globale Objekt konvertiert und primitive Werte werden nicht in Wrapper-Objekte konvertiert. Der Wert this , der über einen Funktionsaufruf übergeben wird (einschließlich Aufrufe, die mit Function.prototype.apply und Function.prototype.call ausgeführt werden) den übergebenen Wert this nicht auf ein Objekt anwenden ( 10.4.3 , 11.1.1 , 15.3.4.3 , 15.3.4.4 ). [meine Betonung]
Wie John Resig schreibt ,
Endlich, eine langjährige (und sehr ärgerlich) Fehler wurde behoben: Fälle wo null oder undefined wird erzwungen zum globalen Objekt werden. Der strikte Modus verhindert dies jetzt passiert und löst eine Ausnahme aus stattdessen.
%Vor%
Wie Sie gezeigt haben, verursacht die Verwendung Ihrer Codezeile innerhalb einer Funktionsdeklaration einen Fehler in JSLint, wohingegen die Verwendung in einem Funktionsausdruck nicht zutrifft. Es sieht so aus, als ob JSLint die Funktionsdeklaration irrtümlich analysiert, sieht this
, das zu diesem Zeitpunkt noch nicht definiert ist, und löst eine Ausnahme aus.
An dieser Stelle denke ich, dass ich Juriy Zaytsev ('kangax') angeben muss:
Spielt es wirklich eine Rolle?
Es ist gut zu verstehen, dass strenger Modus keine Voraussetzung ist , aber ist nur eine Option. Es ist da um schärfere Regeln für diejenigen, die brauche es und bin bereit, damit klarzukommen (und genießen) Konsequenzen.
Update: Endlich habe ich eine Erklärung gefunden. Wenn Sie diesen Thread lesen , besonders ab Nachricht # 1512, lesen Sie das
Der Punkt von ES5 / strict ist zu verbieten Leaking des globalen Objekts, etwas, das ES3 promiskuitiv macht. ES5 / strict macht etwas von seiner Arbeit dynamisch und einige seiner Arbeit statisch. JSLint macht alles statisch arbeiten, also muss es eben sein restriktiver, um am besten zu helfen Sie bekommen Ihr Programm richtig. [Douglas Crockford in # 1553]
Ich muss zugeben, dass er hier einen gültigen Punkt hat: Wenn Sie die globale Namensraumverschmutzung vermeiden wollen, sollten Sie Funktionsdeklarationen, aber Funktionsausdrücke in einem privaten Namensraum sowieso nicht verwenden. Aber ich stimme mit anderen in dem erwähnten Thread überein, dass die Fehlermeldung expliziter sein sollte (und wahrscheinlich eine Warnung auslösen sollte, wenn man auf eine Funktionsdeklaration trifft).
Nach dem, was David Dorward gesagt hat, habe ich etwas gefunden, das den JSLint-Test besteht. Das ist völlig seltsam, warum es so ist.
Vorher: (siehe Frage)
Nachher:
%Vor%BEARBEITEN:
Ich fragte Douglas Crockford:
JSLint erlaubt dies nur im strikten Modus in Funktionen, die offensichtlich sind soll als Methode aufgerufen werden. Damit schreibe
%Vor%
Dies bestätigt, was es in der Spezifikation sagt, außer es ist viel klarer!
Tags und Links javascript ecmascript-5 strict use-strict