JSLint nagle ogłasza: użyj formy funkcji „użyj ścisłe”

930

Dołączam oświadczenie:

"use strict";

na początku większości moich plików Javascript.

JSLint nigdy przed tym nie ostrzegał. Ale teraz jest tak, mówiąc:

Użyj postaci funkcyjnej „use strict”.

Czy ktoś wie, jaka byłaby „forma funkcji”?

Zhami
źródło

Odpowiedzi:

1010

Uwzględnij 'use strict';jako pierwszą instrukcję w funkcji zawijania, więc wpływa ona tylko na tę funkcję. Zapobiega to problemom podczas łączenia skryptów, które nie są ścisłe.

Zobacz najnowszy post na blogu Douglasa Crockforda Strict Mode Is Coming To Town .

Przykład z tego postu:

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

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

Aktualizacja: Jeśli nie chcesz zawijać funkcji natychmiastowej (np. Jest to moduł węzła), możesz wyłączyć ostrzeżenie.

W przypadku JSLint (na Zhami ):

/*jslint node: true */

W przypadku JSHint :

/*jshint strict:false */

lub (według Laith Shadeed )

/* jshint -W097 */

Aby wyłączyć dowolne ostrzeżenie z JSHint, sprawdź mapę w kodzie źródłowym JSHint (szczegóły w dokumentacji ).

Aktualizacja 2: JSHint obsługuje node:booleanopcję. Zobacz .jshintrcna github .

/* jshint node: true */
bdukes
źródło
1
W JSLint dla Visual Studio jest dostępna opcja: „Allow global ES5 strict”
Jowen,
10
Nie ma to jednak sensu w przypadku aplikacji Node. -1
bevacqua,
1
Cześć Nico, zaktualizowałem odpowiedź, dla węzła możesz wpisać: / * jshint -W097 * /, aby wyłączyć to ostrzeżenie
Laith Shadeed
@LaithShadeed Alternatywą byłoby wyjaśnienie /*jshint strict:false */, co robisz (chyba że kod numeryczny ma szczególne zalety, których nie jestem świadomy)
bdukes
2
@Noumenon nie jest tak naprawdę szablonem, jest to dyrektywa, która zmienia środowisko, w którym działa Twój kod. To powiedziawszy, nowa składnia ES6 (moduły i klasy) są domyślnie surowe (patrz ecma-international.org/ecma-262/6.0/ # sec-strict-mode-code ), więc idąc naprzód, nie trzeba będzie zaśmiecać go wszędzie. W międzyczasie możesz zawinąć cały kod w plik IIFE , aby określić "use strict";tylko raz na plik.
bdukes
217

Jeśli piszesz moduły dla NodeJS, są one już zamknięte. Poinformuj JSLint, że masz węzeł, umieszczając na górze pliku:

/*jslint node: true */
Zhami
źródło
2
Do Twojej wiadomości, ta opcja działa dla JSLint, ale JSHint nie wyłącza ostrzeżenia o ścisłości w tej dyrektywie. W przypadku JSHint spróbuj/*jshint strict:false */
bdukes
4
Napisane dla mnie w JSHint v2.9.2. Dodano "node": truedo .jshintrc
RyanM
71

Sugerowałbym zamiast tego użyć jshint .

Pozwala to ukryć to ostrzeżenie poprzez /*jshint globalstrict: true*/.

Jeśli piszesz bibliotekę, sugerowałbym użycie globalnej ścisłości tylko wtedy, gdy kod jest zamknięty w moduły, tak jak w przypadku nodejs.

W przeciwnym razie zmusisz wszystkich, którzy korzystają z Twojej biblioteki, do trybu ścisłego.

Thorsten Lorenz
źródło
4
FYI: Opcja globalstrict w JSHint uległa zmianie. Spróbuj strict: 'global'teraz i zobacz jshint.com/docs/options/#globalstrict
Hovis Biddle
17

Zacząłem tworzyć aplikację Node.js / Browserify po wpisie na blogu JavaScript na wielu platformach . I natknąłem się na ten problem, ponieważ mój nowy plik Gruntfile nie przeszedł jshint.

Na szczęście znalazłem odpowiedź w książce Leanpub na temat Grunta :

Jeśli spróbujemy teraz, przeskanujemy nasz plik Gruntfile… i otrzymamy kilka błędów:

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

Oba błędy są spowodowane tym, że plik Gruntfile jest programem węzłowym i domyślnie JSHint nie rozpoznaje ani nie zezwala na użycie modulewersji łańcuchowej use strict. Możemy ustawić regułę JSHint, która będzie akceptować nasze programy Węzłów. Przeprowadź edycję konfiguracji zadania jshint i dodaj klucz opcji:

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

Dodanie node: truedo jshinta options, aby wprowadzić jshinta w „tryb węzła”, usunęło dla mnie oba błędy.

qris
źródło
16

Dodaj plik .jslintrc (lub .jshintrc w przypadku jshint) w katalogu głównym projektu o następującej treści:

{
    "node": true
}
Sahil Ahuja
źródło
15

Nie ma nic złego w formie łańcucha.

Zamiast unikać „globalnej” ścisłej formy w celu obawy o połączenie nieściśliwego javascript, prawdopodobnie lepiej jest po prostu naprawić ten cholerny, jaśniejszy skrypt javascript.

glikoslave
źródło
0

Myślę, że wszyscy przeoczyli „nagle” część tego pytania. Najprawdopodobniej w pliku .jshintrc wystąpił błąd składniowy, więc nie zawiera wiersza „przeglądarki”. Uruchom go przez moduł sprawdzania poprawności json, aby zobaczyć, gdzie jest błąd.

Sterowiec
źródło
1
Nie, stało się to nagle, ponieważ usługa online JSLint dodała tę funkcję w 2010 roku, kiedy zadano pytanie.
Quentin,
0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

dodaj te linie do punktu początkowego pliku

DB K
źródło
-4

Oto jakie to proste: jeśli chcesz zachować ścisłość całego kodu, dodaj "use strict";na początku kodu JavaScript.

Ale jeśli chcesz być ściśle związany z częścią kodu, skorzystaj z formularza funkcji. W każdym razie poleciłbym ci użycie go na początku JavaScript, ponieważ pomoże ci to być lepszym programistą.

Jason Stackhouse
źródło
8
Naprawdę pojawia się ten błąd, gdy umieszczam tylko "use strict";na górze mojego pliku JS, więc może to nie być do końca prawda.
moesef
@moesef To dlatego, że masz błędy w kodzie. Ma tylko pomóc poprawić umiejętności kodowania i sprawić, że kod będzie mniej „luźny” ... nie będzie akceptował niezadeklarowanych zmiennych itp.
Jason Stackhouse
11
@JasonStackhouse: Nieprawda. JSLint nie zaakceptuje „globalnej” formy "use strict";, w której jest umieszczony na górze kodu. Zezwala tylko "use strict;"wtedy, gdy jest zawinięty w funkcję. (JS_Hint_ pozwala jednak na użycie formularza globalnego - patrz odpowiedź powyżej dla potrzebnych ustawień).
peterflynn