JSLint meldet plötzlich: Verwenden Sie die Funktionsform "use strict".

930

Ich füge die Aussage hinzu:

"use strict";

am Anfang der meisten meiner Javascript-Dateien.

JSLint hat noch nie davor gewarnt. Aber jetzt heißt es:

Verwenden Sie die Funktionsform "use strict".

Weiß jemand, was die "Funktionsform" wäre?

Zhami
quelle

Antworten:

1010

Fügen Sie 'use strict';als erste Anweisung in einer Verpackungsfunktion, so dass es nur diese Funktion beeinflusst. Dies verhindert Probleme beim Verketten von Skripten, die nicht streng sind.

Siehe Douglas Crockfords neuesten Blog-Beitrag Strict Mode Is Coming To Town .

Beispiel aus diesem Beitrag:

(function () {
   'use strict';
   // this function is strict...
}());

(function () {
   // but this function is sloppy...
}());

Update: Wenn Sie die Sofortfunktion nicht einbinden möchten (z. B. ein Knotenmodul), können Sie die Warnung deaktivieren.

Für JSLint (per Zhami ):

/*jslint node: true */

Für JSHint :

/*jshint strict:false */

oder (per Laith Shadeed )

/* jshint -W097 */

Überprüfen Sie die Zuordnung im JSHint-Quellcode (Details in den Dokumenten ), um eine beliebige Warnung von JSHint zu deaktivieren .

Update 2: JSHint unterstützt node:booleanOption. Siehe .jshintrcbei Github .

/* jshint node: true */
bdukes
quelle
1
In JSLint für Visual Studio ist es die Option: "Globales ES5 streng zulassen"
Jowen
10
Dies ist jedoch für Knotenanwendungen nicht sinnvoll. -1
Bevacqua
1
Hallo Nico, ich habe die Antwort aktualisiert. Für den Knoten können Sie Folgendes eingeben: / * jshint -W097 * / um diese Warnung zu deaktivieren
Laith Shadeed
@ LaithShadeed Eine Alternative wäre /*jshint strict:false */, klarer zu machen, was Sie tun (es sei denn, Ihr numerischer Code hat einen besonderen Vorteil, den ich nicht kenne)
bdukes
2
@Noumenon es ist nicht wirklich Boilerplate, es ist eine Direktive, die die Umgebung ändert, in der Ihr Code ausgeführt wird. Die neue ES6-Syntax (Module und Klassen) ist jedoch standardmäßig streng (siehe ecma-international.org/ecma-262/6.0/). # sec-strict-mode-code ), daher muss dies in Zukunft nicht überall weggeworfen werden. In der Zwischenzeit können Sie Ihren gesamten Code in ein IIFE einbinden, um nur "use strict";einmal pro Datei angeben zu müssen .
Bdukes
217

Wenn Sie Module für NodeJS schreiben, sind diese bereits gekapselt. Teilen Sie JSLint mit, dass Sie einen Knoten haben, indem Sie oben in Ihre Datei einfügen:

/*jslint node: true */
Zhami
quelle
2
Zu Ihrer Information, diese Option funktioniert für JSLint, aber JSHint deaktiviert die Strenge-Warnung mit dieser Anweisung nicht. Für JSHint versuchen Sie/*jshint strict:false */
bdukes
4
Für mich mit JSHint v2.9.2 formuliert. Hinzugefügt "node": truezu .jshintrc
RyanM
71

Ich würde vorschlagen, stattdessen jshint zu verwenden.

Es ermöglicht die Unterdrückung dieser Warnung über /*jshint globalstrict: true*/.

Wenn Sie eine Bibliothek schreiben, würde ich nur empfehlen, global strict zu verwenden, wenn Ihr Code in Module eingekapselt ist, wie dies bei nodejs der Fall ist.

Andernfalls würden Sie jeden, der Ihre Bibliothek verwendet, in den strengen Modus zwingen.

Thorsten Lorenz
quelle
4
Zu Ihrer Information: Die Option globalstrict in JSHint hat sich geändert. Versuchen Sie es strict: 'global'jetzt und sehen Sie jshint.com/docs/options/#globalstrict
Hovis Biddle
17

Ich habe nach dem plattformübergreifenden JavaScript- Blogbeitrag mit der Erstellung einer Node.js / browserify-Anwendung begonnen . Und ich bin auf dieses Problem gestoßen, weil mein brandneues Gruntfile jshint nicht bestanden hat.

Zum Glück habe ich im Leanpub-Buch über Grunt eine Antwort gefunden :

Wenn wir es jetzt versuchen, werden wir unser Gruntfile scannen ... und einige Fehler erhalten:

$ grunt jshint

Running "jshint:all" (jshint) task
Linting Gruntfile.js...ERROR
[L1:C1] W097: Use the function form of "use strict".
'use strict';
Linting Gruntfile.js...ERROR
[L3:C1] W117: 'module' is not defined.
module.exports = function (grunt) {

Warning: Task "jshint:all" failed. Use --force to continue.

Beide Fehler sind darauf zurückzuführen, dass die Grunt-Datei ein Knotenprogramm ist und JSHint standardmäßig die Verwendung moduleund die Zeichenfolgenversion von nicht erkennt oder zulässt use strict. Wir können eine JSHint-Regel festlegen, die unsere Knotenprogramme akzeptiert. Lassen Sie uns unsere jshint-Taskkonfiguration bearbeiten und einen Optionsschlüssel hinzufügen:

jshint: {
  options: {
    node: true
  },
}

Durch Hinzufügen node: truezum jshint options, um jshint in den "Knotenmodus" zu versetzen, wurden beide Fehler für mich entfernt.

qris
quelle
16

Fügen Sie im Stammverzeichnis Ihres Projekts eine Datei .jslintrc (oder im Fall von jshint .jshintrc) mit folgendem Inhalt hinzu:

{
    "node": true
}
Sahil Ahuja
quelle
15

An der Zeichenfolgenform ist von Natur aus nichts auszusetzen.

Anstatt die "globale" strenge Form zu vermeiden, um nicht strenges Javascript zu verketten, ist es wahrscheinlich besser, das verdammte nicht strenge Javascript einfach als streng zu korrigieren.

Glykosklave
quelle
0

Ich denke, jeder hat den "plötzlich" Teil dieser Frage verpasst. Höchstwahrscheinlich weist Ihre .jshintrc-Datei einen Syntaxfehler auf, sodass die Zeile "Browser" nicht enthalten ist. Führen Sie es durch einen JSON-Validator, um festzustellen, wo der Fehler liegt.

Luftschiff
quelle
1
Nein, es ist plötzlich passiert, weil der Online-JSLint-Dienst diese Funktion 2010 hinzugefügt hat, als die Frage gestellt wurde.
Quentin
0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

Fügen Sie diese Zeilen am Startpunkt Ihrer Datei hinzu

DB K.
quelle
-4

So einfach ist das: Wenn Sie mit Ihrem gesamten Code streng umgehen möchten, fügen Sie ihn "use strict";am Anfang Ihres JavaScript hinzu.

Wenn Sie jedoch nur mit einem Teil Ihres Codes streng sein möchten, verwenden Sie das Funktionsformular. Auf jeden Fall würde ich Ihnen empfehlen, es am Anfang Ihres JavaScript zu verwenden, da dies Ihnen hilft, ein besserer Programmierer zu sein.

Jason Stackhouse
quelle
8
Ich erhalte diesen Fehler tatsächlich, wenn ich ihn nur "use strict";oben in meine JS-Datei einfüge, sodass dies möglicherweise nicht ganz der Fall ist.
Moesef
@moesef Das liegt daran, dass Sie Fehler in Ihrem Code haben. Es ist nur da, um Ihre Codierungsfähigkeiten zu verbessern und Ihren Code weniger "locker" zu machen ... es akzeptiert keine nicht deklarierten Variablen usw. ...
Jason Stackhouse
11
@ JasonStackhouse: Nicht wahr. JSLint akzeptiert nicht die "globale" Form von "use strict";, bei der sie nur oben in Ihrem Code platziert wird. Es ist nur zulässig, "use strict;"wenn es in eine Funktion eingeschlossen ist. (Mit JS_Hint_ können Sie jedoch das globale Formular verwenden. Die erforderliche Einstellung finden Sie in der obigen Antwort.)
Peterflynn