JSLint sta improvvisamente segnalando: utilizzare il modulo funzione di "usa rigoroso"


930

Includo la dichiarazione:

"use strict";

all'inizio della maggior parte dei miei file Javascript.

JSLint non lo ha mai avvertito prima. Ma ora lo è, dicendo:

Utilizzare il modulo funzione di "usa rigoroso".

Qualcuno sa quale sarebbe il "modulo di funzione"?

Risposte:


1010

Includi 'use strict';come prima istruzione in una funzione di wrapping, quindi influisce solo su quella funzione. Questo evita problemi durante la concatenazione di script non severi.

Vedi l'ultimo post sul blog di Douglas Crockford, Strict Mode Is Coming To Town .

Esempio da quel post:

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

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

Aggiornamento: Nel caso in cui non si desideri avvolgere in funzione immediata (ad es. Si tratta di un modulo nodo), è possibile disabilitare l'avviso.

Per JSLint (per Zhami ):

/*jslint node: true */

Per JSHint :

/*jshint strict:false */

o (per Laith Shadeed )

/* jshint -W097 */

Per disabilitare qualsiasi avviso arbitrario da JSHint, controlla la mappa nel codice sorgente JSHint (dettagli nei documenti ).

Aggiornamento 2: JSHint supporta l' node:booleanopzione. Vedi .jshintrcsu github .

/* jshint node: true */

1
In JSLint per Visual Studio è l'opzione: "Consenti ES5 globale rigoroso"
Jowen,

10
Tuttavia, ciò non ha senso per le applicazioni Node. -1
Bevacqua,

1
Ciao Nico, ho aggiornato la risposta, per nodo puoi digitare: / * jshint -W097 * / per disabilitare questo avviso
Laith Shadeed

@LaithShadeed Un'alternativa sarebbe /*jshint strict:false */, per rendere più chiaro ciò che stai facendo (a meno che non ci sia un vantaggio particolare per il tuo codice numerico di cui non sono a conoscenza)
bdukes

2
@Noumenon non è proprio una piastra di comando, è una direttiva che modifica l'ambiente in cui è in esecuzione il codice. Detto questo, la nuova sintassi ES6 (moduli e classi) è severa per impostazione predefinita (vedi ecma-international.org/ecma-262/6.0/ # sec-strict-mode-code ), quindi in futuro non sarà necessario sparpagliare ovunque. Nel frattempo, puoi racchiudere tutto il codice in un IIFE per specificare solo "use strict";una volta per file.
bdukes il

217

Se stai scrivendo moduli per NodeJS, sono già incapsulati. Dì a JSLint che hai il nodo includendo nella parte superiore del tuo file:

/*jslint node: true */

2
Cordiali saluti, questa opzione funziona per JSLint, ma JSHint non disattiva l'avviso di rigore con questa direttiva. Per JSHint, prova/*jshint strict:false */
bdukes

4
Formulato per me con JSHint v2.9.2. Aggiunto "node": truea .jshintrc
RyanM

71

Suggerirei invece di usare jshint .

Permette di sopprimere questo avviso tramite /*jshint globalstrict: true*/.

Se stai scrivendo una libreria, suggerirei di usare il rigoroso globale solo se il tuo codice è incapsulato in moduli come nel caso di nodejs.

Altrimenti forzeresti chiunque usi la tua libreria in modalità rigorosa.



4
FYI: L'opzione globalstrict in JSHint è cambiata. Prova strict: 'global'ora e vedi jshint.com/docs/options/#globalstrict
Hovis Biddle

17

Ho iniziato a creare un'applicazione Node.js / browserify seguendo il post sul blog JavaScript multipiattaforma . E ho riscontrato questo problema, perché il mio nuovissimo Gruntfile non ha superato jshint.

Fortunatamente ho trovato una risposta nel libro Leanpub su Grunt :

Se lo proviamo ora, analizzeremo il nostro Gruntfile ... e otterremo alcuni errori:

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

Entrambi gli errori sono dovuti al fatto che Gruntfile è un programma Node e, per impostazione predefinita, JSHint non riconosce o consente l'utilizzo modulee la versione di stringa di use strict. Possiamo impostare una regola JSHint che accetterà i nostri programmi Node. Modifichiamo la nostra configurazione dell'attività jshint e aggiungiamo un tasto opzioni:

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

Aggiungendo node: truea jshint options, per mettere jshint in "Modalità nodo", ho rimosso entrambi gli errori.


16

Aggiungi un file .jslintrc (o .jshintrc nel caso di jshint) alla radice del tuo progetto con il seguente contenuto:

{
    "node": true
}

15

Non c'è nulla di innato nella forma della stringa.

Invece di evitare la forma rigorosa "globale" per preoccuparsi di concatenare javascript non rigoroso, probabilmente è meglio semplicemente correggere il maledetto javascript non rigoroso.


0

Penso che tutti abbiano perso la parte "improvvisamente" di questa domanda. Molto probabilmente, il tuo .jshintrc ha un errore di sintassi, quindi non include la riga "browser". Eseguilo attraverso un validatore json per vedere dove si trova l'errore.


1
No, è successo all'improvviso perché il servizio JSLint online ha aggiunto quella funzione nel 2010 quando è stata posta la domanda.
Quentin,

0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

aggiungi queste righe al punto iniziale del tuo file


-4

Ecco come è semplice: se vuoi essere rigoroso con tutto il tuo codice, aggiungi "use strict";all'inizio del tuo JavaScript.

Ma se vuoi solo essere rigoroso con parte del tuo codice, usa il modulo di funzione. Ad ogni modo, ti consiglierei di usarlo all'inizio del tuo JavaScript perché questo ti aiuterà a essere un programmatore migliore.


8
Ricevo effettivamente questo errore quando lo metto solo "use strict";all'inizio del mio file JS, quindi potrebbe non essere del tutto vero.
Moesef,

@moesef Questo perché hai errori nel tuo codice. È lì solo per aiutarti a migliorare le tue abilità di codifica e rendere il tuo codice meno "sciolto" ... non accetterà variabili non dichiarate ecc ...
Jason Stackhouse

11
@JasonStackhouse: Not true. JSLint non accetterà la forma "globale" "use strict";, in cui è appena posizionato nella parte superiore del codice. Permette solo "use strict;"se avvolto in una funzione. (JS_Hint_ ti consente di utilizzare il modulo globale, tuttavia - vedi la risposta sopra per l'impostazione necessaria).
peterflynn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.