javascript - JSLint rapporterer plutselig: Bruk funksjonsformen av "use strict"
Jeg inkluderer uttalelsen:
"use strict";
i begynnelsen av de fleste av mine Javascript-filer.
JSLint har aldri tidligere advart om dette. Men nå gjør det det, og sier:
Bruk funksjonsformen av "use strict".
Vet noen hva «funksjonsformen» ville være?
Svar #1
Inkluder 'use strict'; som den første setningen i en omsluttende funksjon, slik at det bare påvirker den funksjonen. Dette forhindrer problemer når man sammenkobler skript som ikke er strenge.
Se Douglas Crockfords siste blogginnlegg Strict Mode Is Coming To Town.
Eksempel fra det innlegget:
(function () {
'use strict';
// this function is strict...
}());
(function () {
// but this function is sloppy...
}());
Oppdatering: Hvis du ikke ønsker å pakke inn i en umiddelbar funksjon (f.eks. det er en Node-modul), kan du deaktivere advarselen.
For JSLint (ifølge Zhami):
/*jslint node: true */
For JSHint:
/*jshint strict:false */
eller (ifølge Laith Shadeed)
/* jshint -W097 */
For å deaktivere enhver vilkårlig advarsel fra JSHint, sjekk kartet i JSHint-kildekoden (detaljer i dokumentasjonen).
Oppdatering 2: JSHint støtter node:boolean-alternativet. Se .jshintrc på GitHub.
/* jshint node: true */
Svar #2
Hvis du skriver moduler for NodeJS, er de allerede innkapslet. Fortell JSLint at du har node ved å inkludere på toppen av filen din:
/*jslint node: true */
Svar #3
Jeg vil foreslå å bruke jshint i stedet.
Det gjør det mulig å undertrykke denne advarselen via /*jshint globalstrict: true*/.
Hvis du skriver et bibliotek, vil jeg bare foreslå å bruke global strict hvis koden din er innkapslet i moduler slik tilfellet er med nodejs.
Ellers ville du tvinge alle som bruker biblioteket ditt til strengt modus.
Svar #4
Jeg begynte å lage en Node.js/browserify-applikasjon etter Cross Platform JavaScript-blogginnlegget. Og jeg støtte på dette problemet, fordi min helt nye Gruntfile ikke bestod jshint.
Heldigvis fant jeg et svar i Leanpub-boken om Grunt:
Hvis vi prøver det nå, vil vi skanne vår Gruntfile… og få noen feil:
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.Begge feilene skyldes at Gruntfile er et Node-program, og som standard gjenkjenner ikke JSHint eller tillater bruk av
moduleog strengversjonen avuse strict. Vi kan sette en JSHint-regel som vil akseptere våre Node-programmer. La oss redigere vår jshint-oppgavekonfigurasjon og legge til en options-nøkkel:jshint: { options: { node: true }, }
Å legge til node: true i jshint options, for å sette jshint i «Node-modus», fjernet begge feilene for meg.
Svar #5
Legg til en fil .jslintrc (eller .jshintrc i tilfelle jshint) i roten av prosjektet ditt med følgende innhold:
{
"node": true
}
Svar #6
Det er ingenting iboende galt med strengformen.
I stedet for å unngå den «globale» strenge formen av frykt for å sammenkoble ikke-streng JavaScript, er det sannsynligvis bedre å bare fikse den forbaska ikke-strenge JavaScripten til å være streng.
