Warum ist das im strikten Modus illegal?

8

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%     
Félix Saparelli 01.12.2010, 10:48
quelle

2 Antworten

6

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

    
Marcel Korpel 01.12.2010, 11:12
quelle
3

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!

    
Félix Saparelli 01.12.2010 11:29
quelle