O JSLint está relatando repentinamente: Use a forma da função "use strict"

930

Eu incluo a declaração:

"use strict";

no início da maioria dos meus arquivos Javascript.

O JSLint nunca havia alertado isso antes. Mas agora é, dizendo:

Use a forma de função "use strict".

Alguém sabe o que seria a "forma de função"?

Zhami
fonte

Respostas:

1010

Incluir 'use strict';como primeira instrução em uma função de quebra automática, portanto, afeta apenas essa função. Isso evita problemas ao concatenar scripts que não são estritos.

Veja o post mais recente de Douglas Crockford no blog O Modo Estrito Está Chegando à Cidade .

Exemplo desse post:

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

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

Atualização: Caso você não deseje interromper a função imediata (por exemplo, é um módulo de nó), poderá desativar o aviso.

Para JSLint (por Zhami ):

/*jslint node: true */

Para JSHint :

/*jshint strict:false */

ou (por Laith Shadeed )

/* jshint -W097 */

Para desativar qualquer aviso arbitrário do JSHint, verifique o mapa no código-fonte do JSHint (detalhes em documentos ).

Atualização 2: JSHint suporta a node:booleanopção. Veja .jshintrcno github .

/* jshint node: true */
bdukes
fonte
1
No JSLint para Visual Studio, é a opção: "Permitir ES5 global estrito"
Jowen 25/10
10
Isso não faz sentido para aplicativos Node, no entanto. -1
Bevacqua
1
Oi Nico, eu atualizei a resposta, para o nó, você pode digitar: / * jshint -W097 * / desativar este aviso
Laith Shadeed
@LaithShadeed Uma alternativa seria /*jshint strict:false */, para tornar mais claro o que você está fazendo (a menos que há um benefício específico para o seu código numérico que eu não estou ciente de)
bdukes
2
@Noumenon não é realmente um clichê, é uma diretiva que altera o ambiente em que seu código está sendo executado. Dito isso, a nova sintaxe ES6 (módulos e classes) é rígida por padrão (consulte ecma-international.org/ecma-262/6.0/ # sec-strict-mode-code ), então, daqui para frente, isso não precisará ser jogado em todos os lugares. Enquanto isso, você pode agrupar todo o seu código em um IIFE para precisar especificar apenas "use strict";uma vez por arquivo.
bdukes
217

Se você está escrevendo módulos para o NodeJS, eles já estão encapsulados. Diga ao JSLint que você possui um nó incluindo no topo do seu arquivo:

/*jslint node: true */
Zhami
fonte
2
Para sua informação, esta opção funciona para JSLint, mas o JSHint não desativa o aviso de rigor com esta diretiva. Para JSHint, tente/*jshint strict:false */
bdukes
4
Escrito para mim com JSHint v2.9.2. Adicionado "node": truea .jshintrc
RyanM
71

Eu sugiro usar o jshint .

Permite suprimir este aviso via /*jshint globalstrict: true*/.

Se você estiver escrevendo uma biblioteca, eu sugeriria apenas o uso de strict global se seu código estiver encapsulado em módulos, como é o caso do nodejs.

Caso contrário, você forçaria todos que estão usando sua biblioteca a entrar no modo estrito.

Thorsten Lorenz
fonte
4
FYI: A opção globalstrict no JSHint foi alterada. Tente strict: 'global'agora e veja jshint.com/docs/options/#globalstrict
Hovis Biddle
17

Comecei a criar um aplicativo Node.js./ browserify seguindo o JavaScript de plataforma cruzada postagem do blog em . E eu me deparei com esse problema, porque meu novíssimo Gruntfile não passou no jshint.

Felizmente, encontrei uma resposta no livro Leanpub sobre Grunt :

Se tentarmos agora, verificaremos nosso Gruntfile ... e obteremos alguns erros:

$ 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 os erros ocorrem porque o Gruntfile é um programa Node e, por padrão, o JSHint não reconhece ou permite o uso modulee a versão da string use strict. Podemos definir uma regra JSHint que aceitará nossos programas Node. Vamos editar nossa configuração da tarefa jshint e adicionar uma chave de opções:

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

Adicionando node: trueao jshint options, para colocar o jshint no "modo Nó", removi os dois erros para mim.

qris
fonte
16

Adicione um arquivo .jslintrc (ou .jshintrc no caso de jshint) na raiz do seu projeto com o seguinte conteúdo:

{
    "node": true
}
Sahil Ahuja
fonte
15

Não há nada errado com a forma da string.

Em vez de evitar a forma estrita "global" por se preocupar em concatenar javascript não estrito, provavelmente é melhor corrigir o maldito javascript não estrito para ser estrito.

glicoslave
fonte
0

Acho que todo mundo perdeu a parte "subitamente" dessa pergunta. Provavelmente, o seu .jshintrc tem um erro de sintaxe, portanto, não está incluindo a linha do 'navegador'. Execute-o através de um validador json para ver onde está o erro.

Dirigível
fonte
1
Não, aconteceu repentinamente porque o serviço JSLint online adicionou esse recurso em 2010 quando a pergunta foi feita.
Quentin
0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

adicione estas linhas no ponto inicial do seu arquivo

DB K
fonte
-4

É simples: se você deseja ser rigoroso com todo o seu código, adicione "use strict";no início do seu JavaScript.

Mas se você quiser apenas ser rigoroso com parte do seu código, use o formulário da função De qualquer forma, eu recomendo que você o use no início do seu JavaScript, pois isso o ajudará a ser um codificador melhor.

Jason Stackhouse
fonte
8
Na verdade, eu recebo esse erro quando coloco apenas "use strict";a parte superior do meu arquivo JS, portanto, isso pode não ser totalmente verdade.
moesef 29/07
@moesef Isso ocorre porque você tem erros no seu código. É só lá para ajudar a tornar suas habilidades de codificação melhor melhor e fazer o seu código menos "solto" ... não aceitará variáveis não declaradas etc ...
Jason Stackhouse
11
@ JasonStackhouse: Não é verdade. O JSLint não aceita a forma "global" de "use strict";, onde é colocada apenas na parte superior do seu código. Só permite "use strict;"quando envolvido em uma função. (JS_Hint_ permite que você use o formulário global - veja a resposta acima para a configuração necessária).
Peterflynn 28/08/2013