JSLint informa repentinamente: utilice la forma de la función de "uso estricto"

930

Incluyo la declaración:

"use strict";

al comienzo de la mayoría de mis archivos Javascript.

JSLint nunca antes había advertido sobre esto. Pero ahora lo es, diciendo:

Utilice la forma de función de "uso estricto".

¿Alguien sabe cuál sería la "forma de función"?

Zhami
fuente

Respuestas:

1010

Incluir 'use strict';como la primera declaración en una función de ajuste, por lo que solo afecta a esa función. Esto evita problemas al concatenar scripts que no son estrictos.

Vea la última publicación de blog de Douglas Crockford Strict Mode Is Coming To Town .

Ejemplo de esa publicación:

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

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

Actualización: en caso de que no desee ajustarse a la función inmediata (por ejemplo, es un módulo de nodo), puede desactivar la advertencia.

Para JSLint (por Zhami ):

/*jslint node: true */

Para JSHint :

/*jshint strict:false */

o (según Laith Shadeed )

/* jshint -W097 */

Para deshabilitar cualquier advertencia arbitraria de JSHint, verifique el mapa en el código fuente de JSHint (detalles en documentos ).

Actualización 2: JSHint admite la node:booleanopción. Ver .jshintrcen github .

/* jshint node: true */
bdukes
fuente
1
En JSLint para Visual Studio es la opción: "Permitir estricto ES5 global"
Jowen
10
Sin embargo, esto no tiene sentido para las aplicaciones Node. -1
bevacqua
1
Hola Nico, actualicé la respuesta, para el nodo puedes escribir: / * jshint -W097 * / para deshabilitar esta advertencia
Laith Shadeed
@LaithShadeed Una alternativa sería /*jshint strict:false */, para hacerlo más claro lo que está haciendo (a menos que haya un beneficio particular a su código numérico que no soy consciente de)
bdukes
2
@Noumenon no es realmente repetitivo, es una directiva que cambia el entorno en el que se está ejecutando su código. Dicho esto, la nueva sintaxis ES6 (módulos y clases) es estricta por defecto (ver ecma-international.org/ecma-262/6.0/ # sec-estricto-modo-código ), así que en el futuro esto no tendrá que estar lleno de basura en todas partes Mientras tanto, puede envolver todo su código en un IIFE para tener que especificar solo "use strict";una vez por archivo.
bdukes
217

Si está escribiendo módulos para NodeJS, ya están encapsulados. Dígale a JSLint que tiene un nodo al incluirlo en la parte superior de su archivo:

/*jslint node: true */
Zhami
fuente
2
Para su información, esta opción funciona para JSLint, pero JSHint no desactiva la advertencia de rigor con esta directiva. Para JSHint, intente/*jshint strict:false */
bdukes
44
Desarrollado para mí con JSHint v2.9.2. Añadido "node": truea .jshintrc
RyanM
71

Sugeriría usar jshint en su lugar.

Permite suprimir esta advertencia a través de /*jshint globalstrict: true*/.

Si está escribiendo una biblioteca, solo sugeriría usar global estricto si su código está encapsulado en módulos, como es el caso de nodejs.

De lo contrario, obligaría a todos los que usan su biblioteca a un modo estricto.

Thorsten Lorenz
fuente
44
FYI: La opción globalstrict en JSHint ha cambiado. Pruébelo strict: 'global'ahora y vea jshint.com/docs/options/#globalstrict
Hovis Biddle el
17

Comencé a crear una aplicación Node.js / browserify después de la publicación del blog Cross Platform JavaScript . Y me encontré con este problema, porque mi nuevo Gruntfile no pasó jshint.

Afortunadamente encontré una respuesta en el libro Leanpub sobre Grunt :

Si lo intentamos ahora, escanearemos nuestro Gruntfile ... y obtendremos algunos errores:

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

Ambos errores se deben a que Gruntfile es un programa Node y, por defecto, JSHint no reconoce ni permite el uso de moduley la versión de cadena de use strict. Podemos establecer una regla JSHint que acepte nuestros programas Node. Editemos nuestra configuración de tarea jshint y agreguemos una clave de opciones:

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

Agregando node: truea jshint options, para poner jshint en "Modo Nodo", eliminé ambos errores para mí.

qris
fuente
16

Agregue un archivo .jslintrc (o .jshintrc en el caso de jshint) en la raíz de su proyecto con el siguiente contenido:

{
    "node": true
}
Sahil Ahuja
fuente
15

No hay nada innatamente mal con la forma de la cadena.

En lugar de evitar la forma estricta "global" por la preocupación de concatenar JavaScript no estricto, probablemente sea mejor arreglar el maldito JavaScript no estricto para que sea estricto.

glucoslave
fuente
0

Creo que todos se perdieron la parte "repentina" de esta pregunta. Lo más probable es que su .jshintrc tenga un error de sintaxis, por lo que no incluye la línea del 'navegador'. Ejecútelo a través de un validador json para ver dónde está el error.

Dirigible
fuente
1
No, de repente sucedió porque el servicio JSLint en línea agregó esa característica en 2010 cuando se hizo la pregunta.
Quentin el
0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

agregue estas líneas al punto de inicio de su archivo

DB K
fuente
-4

Así de simple es: si desea ser estricto con todo su código, agregue "use strict"; al comienzo de su JavaScript.

Pero si solo quiere ser estricto con algunos de sus códigos, use el formulario de función. De todos modos, le recomendaría que lo use al comienzo de su JavaScript porque esto lo ayudará a ser un mejor codificador.

Jason Stackhouse
fuente
8
De hecho, recibo este error cuando solo pongo "use strict";en la parte superior de mi archivo JS, por lo que esto podría no ser del todo cierto.
moesef
@moesef Eso es porque tienes errores en tu código. Está ahí para ayudarlo a mejorar sus habilidades de codificación y hacer que su código sea menos "suelto" ... no aceptará variables no declaradas, etc ...
Jason Stackhouse
11
@JasonStackhouse: No es cierto. JSLint no aceptará la forma "global" de "use strict";, donde solo se coloca en la parte superior de su código. Solo permite "use strict;"cuando está envuelto en una función. (Sin embargo, JS_Hint_ le permite utilizar el formulario global; consulte la respuesta anterior para conocer la configuración necesaria).
peterflynn