Recentemente, executei parte do meu código JavaScript no JSLint de Crockford e deu o seguinte erro:
Problema na linha 1, caractere 1: declaração "use strict" ausente.
Pesquisando, percebi que algumas pessoas adicionam "use strict";
seu código JavaScript. Depois de adicionar a instrução, o erro parou de aparecer. Infelizmente, o Google não revelou grande parte da história por trás dessa declaração. Certamente, deve ter algo a ver com a maneira como o JavaScript é interpretado pelo navegador, mas não tenho idéia de qual seria o efeito.
Então, o que se "use strict";
trata, o que isso implica e ainda é relevante?
Algum dos navegadores atuais responde à "use strict";
string ou é para uso futuro?
javascript
syntax
jslint
use-strict
Mark Rogers
fonte
fonte
"use strict";
sozinho não torna o JS com escopo lexicamente. Declarar variáveis comlet
e tambémconst
deve ser usado.Respostas:
Este artigo sobre o Javascript Strict Mode pode lhe interessar: John Resig - ECMAScript 5 Strict Mode, JSON e mais
Para citar algumas partes interessantes:
E:
Observe também que você pode aplicar o "modo estrito" a todo o arquivo ... Ou pode usá-lo apenas para uma função específica (ainda citando o artigo de John Resig) :
O que pode ser útil se você precisar misturar código antigo e novo ;-)
Então, suponho que seja um pouco como o que
"use strict"
você pode usar no Perl (daí o nome?) : Ajuda a cometer menos erros, detectando mais coisas que podem levar a quebras.O modo estrito agora é suportado por todos os principais navegadores .
Dentro dos módulos ECMAScript nativos (com
import
eexport
instruções) e classes ES6 , o modo estrito está sempre ativado e não pode ser desativado.fonte
"use strict"
no Firefox 3.6, Safari 5, Chrome 7 e Opera 10.6 (todos Mac). Sem erros, então eu acho que 'use strict' ainda não é suportado em nenhum navegador. Porém, não testei no IE9;) #É um novo recurso do ECMAScript 5. John Resig escreveu um bom resumo .
É apenas uma string que você coloca nos arquivos JavaScript (na parte superior do arquivo ou dentro de uma função) que fica assim:
Colocá-lo no seu código agora não deve causar problemas nos navegadores atuais, pois é apenas uma sequência. Pode causar problemas no seu código no futuro, se violar o pragma. Por exemplo, se você tiver atualmente
foo = "bar"
sem definirfoo
primeiro, seu código começará a falhar ... o que é uma coisa boa na minha opinião.fonte
<script>"use strict";
. A bandeira se aplica somente ao bloco em que está incluída.'use strict';
vez"use strict";
, falhará. Isso faz mais sentido, porque se ele for incluído no objeto global, significa que talvez não funcione na próxima vez em que você executar a função / executar outra coisa que redefina o bloco, pois estará no bloco mais alto (global).A instrução
"use strict";
instrui o navegador a usar o modo Estrito, que é um conjunto de recursos reduzido e mais seguro do JavaScript.Lista de recursos (não exaustiva)
Não permite variáveis globais. (Captura
var
declarações ausentes e erros de digitação em nomes de variáveis)Atribuições com falha silenciosa geram erro no modo estrito (atribuindo
NaN = 5;
)Tentativas de excluir propriedades não excluídas lançarão (
delete Object.prototype
)Requer que todos os nomes de propriedades em um literal de objeto sejam únicos (
var x = {x1: "1", x1: "2"}
)Os nomes dos parâmetros de função devem ser exclusivos (
function sum (x, x) {...}
)Proíbe a sintaxe octal (
var x = 023;
alguns desenvolvedores assumem incorretamente que o zero anterior não faz nada para alterar o número.)Proíbe a
with
palavra - chaveeval
no modo estrito não introduz novas variáveisProíbe a exclusão de nomes simples (
delete x;
)Proíbe a ligação ou atribuição de nomes
eval
earguments
sob qualquer formaO modo estrito não aliasa propriedades do
arguments
objeto com os parâmetros formais. (ou seja, emfunction sum (a,b) { return arguments[0] + b;}
Isso funciona porquearguments[0]
está vinculado aa
e assim por diante.)arguments.callee
não é suportado[Ref: Modo restrito , Mozilla Developer Network ]
fonte
window.foo = bar
).Se as pessoas estiverem preocupadas com o uso
use strict
, vale a pena conferir este artigo:Suporte ao ECMAScript 5 'Strict mode' em navegadores. O que isto significa?
NovoGeek.com - blog de Krishna
Ele fala sobre o suporte ao navegador, mas o mais importante é como lidar com ele com segurança:
fonte
window
this
a qual não pode mirarwindow
?this
pertence à sua própria função e não a janela mundialthis
um é realmenteundefined
.Uma palavra de cautela, todos os programadores exigentes: aplicar
"use strict"
ao código existente pode ser perigoso! Essa coisa não é um adesivo de cara feliz que você pode colocar no código para torná-lo 'melhor'. Com o"use strict"
pragma, o navegador lançará repentinamente exceções em locais aleatórios que nunca foram lançados antes, porque naquele momento você está fazendo algo que o JavaScript padrão / solto permite, felizmente, mas abomina o JavaScript! Você pode ter violações de rigidez ocultas em chamadas raramente usadas no seu código, que só lançam uma exceção quando elas acabam sendo executadas - por exemplo, no ambiente de produção usado pelos clientes pagantes!Se você quiser mergulhar, é uma boa ideia aplicar
"use strict"
testes de unidade abrangentes e uma tarefa de construção JSHint estritamente configurada que lhe dará alguma confiança de que não existe um canto escuro do seu módulo que exploda terrivelmente só porque você ativou o Modo estrito. Ou, ei, aqui está outra opção: simplesmente não adicione"use strict"
nenhum código herdado, provavelmente é mais seguro assim, honestamente. DEFINITIVAMENTE, NÃO adicione"use strict"
nenhum módulo que você não possua ou mantenha, como módulos de terceiros.Eu acho que mesmo que seja um animal mortal enjaulado,
"use strict"
pode ser uma coisa boa, mas você precisa fazer o que é certo. O melhor momento para ser rigoroso é quando seu projeto é greenfield e você está começando do zero. ConfigureJSHint/JSLint
com todos os avisos e opções acionados o mais apertado que sua equipe possa suportar, obtenha um bom sistema de compilação / teste / asserção do mesmo tipoGrunt+Karma+Chai
, e só então comece a marcar todos os seus novos módulos como"use strict"
. Esteja preparado para curar muitos erros e avisos negativos. Certifique-se de que todos entendam a gravidade configurando a compilação para FAIL seJSHint/JSLint
houver alguma violação.Meu projeto não era um projeto greenfield quando adotei
"use strict"
. Como resultado, meu IDE está cheio de marcas vermelhas porque não tenho"use strict"
metade dos meus módulos, e o JSHint reclama disso. É um lembrete para mim sobre o que refatoração devo fazer no futuro. Meu objetivo é ser livre de marcas vermelhas devido a todas as minhas"use strict"
declarações ausentes , mas isso é daqui a anos.fonte
"use strict";
ao código existente. Dito isto, eu vou quase sempre usá-lo quando estou escrevendo novo código a partir do zeroO uso
'use strict';
não melhora repentinamente o seu código.O modo estrito de JavaScript é um recurso do ECMAScript 5 . Você pode ativar o modo estrito declarando isso na parte superior do seu script / função.
Quando um mecanismo JavaScript vê essa diretiva , ele começa a interpretar o código em um modo especial. Nesse modo, erros são gerados quando determinadas práticas de codificação que podem acabar sendo possíveis erros são detectadas (que é o raciocínio por trás do modo estrito).
Considere este exemplo:
Em sua obsessão em alinhar os literais numéricos, o desenvolvedor inadvertidamente inicializou a variável
b
com um literal octal. O modo não estrito interpretará isso como um literal numérico com valor24
(na base 10). No entanto, o modo estrito gera um erro.Para uma lista não exaustiva de especialidades no modo estrito, consulte esta resposta .
Onde devo usar
'use strict';
?No meu novo aplicativo JavaScript: Absolutamente! O modo estrito pode ser usado como denunciante quando você está fazendo algo estúpido com seu código.
No meu código JavaScript existente : Provavelmente não! Se o seu código JavaScript existente tiver instruções proibidas no modo estrito, o aplicativo simplesmente será interrompido. Se você quiser o modo estrito, esteja preparado para depurar e corrigir seu código existente. É por isso que o uso
'use strict';
não melhora repentinamente o seu código .Como uso o modo estrito?
Insira uma
'use strict';
declaração em cima do seu script:Observe que tudo no arquivo
myscript.js
será interpretado no modo estrito.Ou insira uma
'use strict';
instrução no topo do seu corpo de função:Tudo no escopo lexical da função
doSomething
será interpretado no modo estrito. A palavra escopo lexical é importante aqui. Por exemplo, se o seu código estrito chama uma função de uma biblioteca que não é estrita , apenas seu código é executado no modo estrito, e não a função chamada. Veja esta resposta para uma melhor explicação.Que coisas são proibidas no modo estrito?
Encontrei um bom artigo descrevendo várias coisas que são proibidas no modo estrito (observe que essa não é uma lista exclusiva):
Palavras reservadas para futuras versões do JavaScript
O ECMAScript 5 adiciona uma lista de palavras reservadas. Se você usá-los como variáveis ou argumentos, o modo estrito gerará um erro. As palavras reservadas são:
Leitura adicional
fonte
'use strict'
diretiva, eles serão executados no modo não estrito, mesmo quando chamados de uma função em execução no modo estrito. Veja este asnwer para uma explicação.this
). Agora vejo que você estava se referindo a chamar outras funções.Eu recomendo fortemente que todos os desenvolvedores comecem a usar o modo estrito agora. Existem navegadores suficientes compatíveis com esse modo estrito, que legitimamente nos ajudará a nos salvar de erros que nem sabíamos que estavam no seu código.
Aparentemente, no estágio inicial, haverá erros que nunca encontramos antes. Para obter todos os benefícios, precisamos fazer testes adequados depois de mudar para o modo estrito para garantir que capturamos tudo. Definitivamente, não apenas lançamos
use strict
nosso código e assumimos que não há erros. Portanto, a questão é que é hora de começar a usar esse recurso de linguagem incrivelmente útil para escrever um código melhor.Por exemplo,
JSLint é um depurador escrito por Douglas Crockford. Basta colar o seu script e ele procurará rapidamente por problemas e erros perceptíveis no seu código.
fonte
Eu gostaria de oferecer uma resposta um pouco mais fundamentada, complementando as outras respostas. Eu esperava editar a resposta mais popular, mas falhei. Tentei torná-lo o mais abrangente e completo possível.
Você pode consultar a documentação do MDN para obter mais informações.
"use strict"
uma diretiva introduzida no ECMAScript 5.As diretivas são semelhantes às declarações, mas diferentes.
use strict
não contém palavras-chave: A diretiva é uma declaração de expressão simples, que consiste em uma string especial literal (entre aspas simples ou duplas). Os mecanismos JavaScript, que não implementam o ECMAScript 5, apenas veem uma declaração de expressão sem efeitos colaterais. Espera-se que versões futuras dos padrões ECMAScript sejam apresentadasuse
como uma palavra-chave real; as cotações se tornariam obsoletas.use strict
pode ser usado apenas no início de um script ou de uma função, ou seja, deve preceder qualquer outra declaração (real). Ele não precisa ser a primeira instrução em um script de função: pode ser precedido por outras expressões de instrução que consistem em literais de strings (e implementações em JavaScript podem tratá-las como diretivas específicas de implementação). Instruções literais de string, que seguem uma primeira declaração real (em um script ou função) são simples expressões. Os intérpretes não devem interpretá-los como diretrizes e eles não têm efeito.A
use strict
diretiva indica que o código a seguir (em um script ou função) é um código estrito. O código no nível mais alto de um script (código que não está em uma função) é considerado código estrito quando o script contém umause strict
diretiva. O conteúdo de uma função é considerado código estrito quando a própria função é definida em um código estrito ou quando a função contém umause strict
diretiva. O código que é passado para umeval()
método é considerado código estrito quandoeval()
foi chamado a partir de um código estrito ou contém ause strict
própria diretiva.O modo estrito do ECMAScript 5 é um subconjunto restrito da linguagem JavaScript, que elimina déficits relevantes da linguagem e apresenta verificação de erros mais rigorosa e maior segurança. A seguir, são apresentadas as diferenças entre o modo estrito e o modo normal (dos quais os três primeiros são particularmente importantes):
with
declaração no modo estrito.Object
, você receberá aReferenceError
. No modo normal, o identificador é declarado implicitamente como uma variável global (como uma propriedade do globalObject
)this
- chave tem o valorundefined
em funções que foram chamadas como funções (não como métodos). (No modo normal,this
sempre aponta para o globalObject
). Essa diferença pode ser usada para testar se uma implementação suporta o modo estrito:Além disso, quando uma função é chamada com
call()
ouapply
no modo estrito,this
é exatamente o valor do primeiro argumento dacall()
ouapply()
invocação. (No modo normalnull
eundefined
são substituídos pelo globalObject
e os valores, que não são objetos, são convertidos em objetos.)No modo estrito, você receberá a
TypeError
quando tentar atribuir propriedades somente leitura ou definir novas propriedades para um objeto não extensível. (No modo normal, ambos simplesmente falham sem mensagem de erro.)eval()
, você não pode declarar ou definir variáveis ou funções no escopo do chamador (como é possível fazê-lo no modo normal). Em vez disso, um novo escopo é criadoeval()
e as variáveis e funções estão dentro desse escopo. Esse escopo é destruído após o término daeval()
execução.SyntaxError
quando odelete
operador for seguido por um identificador não qualificado (uma variável, função ou parâmetro de função). No modo normal, adelete
expressão não faria nada e é avaliada comofalse
.TypeError
quando tentar excluir uma propriedade não configurável. (No modo normal, a tentativa simplesmente falha e adelete
expressão é avaliada comofalse
).0x
. (No modo normal, algumas implementações permitem literais octais).eval
earguments
são tratados como palavras-chave. Você não pode alterar seu valor, não pode atribuir um valor a eles e não pode usá-los como nomes para variáveis, funções, parâmetros de função ou identificadores de um bloco de captura.arguments.caller
earguments.callee
causar aTypeError
em uma função no modo estrito. Além disso, algumas propriedades de chamadas e argumentos de funções no modo estrito causam umTypeError
quando você tenta lê-las.fonte
0
.Meus dois centavos:
Um dos objetivos do modo estrito é permitir a depuração mais rápida de problemas. Ajuda os desenvolvedores lançando exceção quando certas coisas erradas podem causar um comportamento silencioso e estranho da sua página da web. No momento em que usamos
use strict
, o código gera erros, o que ajuda o desenvolvedor a corrigi-lo com antecedência.Poucas coisas importantes que aprendi depois de usar
use strict
:Impede a declaração variável global:
Agora, esse código cria
nameoftree
no escopo global que pode ser acessado usandowindow.nameoftree
. Quando implementamosuse strict
o código lançaria um erro.Sample
Elimina a
with
declaração:with
As instruções não podem ser minificadas usando ferramentas como uglify-js . Eles também foram descontinuados e removidos de versões futuras do JavaScript.Sample
Impede duplicatas:
Quando temos propriedade duplicada, ela lança uma exceção
Existem poucos, mas preciso obter mais conhecimento sobre isso.
fonte
Se você usar um navegador lançado no ano passado, provavelmente será compatível com o modo Estrito JavaScript. Somente navegadores antigos anteriores ao ECMAScript 5 se tornaram o padrão atual não o suportam.
As aspas ao redor do comando garantem que o código ainda funcione em navegadores mais antigos (embora as coisas que geram um erro de sintaxe no modo estrito geralmente causem mau funcionamento do script de alguma maneira difícil de detectar nesses navegadores mais antigos).
fonte
Ao adicionar
"use strict";
, os seguintes casos lançam um SyntaxError antes da execução do script:Pavimentando o caminho para futuras versões ECMAScript , usando uma das palavras-chave recém-reservados (em previsão para ECMAScript 6 ):
implements
,interface
,let
,package
,private
,protected
,public
,static
, eyield
.Declarando função em blocos
Sintaxe octal
this
aponte para o objeto global.Declarando o dobro do mesmo nome para um nome de propriedade em um literal de objeto
Esse não é mais o caso do ECMAScript 6 ( bug 1041128 ).
Declarando dois argumentos de função com a mesma função de nome
Definir um valor para uma variável não declarada
Usando
delete
em um nome de variáveldelete myVariable;
Usando
eval
ouarguments
como nome de argumento de variável ou funçãoFontes:
Transição para o modo estrito no MDN
Modo estrito no MDN
Modo estrito do JavaScript e por que você deve usá-lo no blog de Colin J. Ihrig (versão arquivada)
fonte
O modo estrito faz várias alterações na semântica normal do JavaScript:
elimina alguns erros silenciosos do JavaScript, alterando-os para gerar erros.
corrige erros que dificultam a otimização dos mecanismos JavaScript.
proíbe alguma sintaxe que provavelmente será definida em versões futuras do ECMAScript.
para obter mais informações, visite Strict Mode- Javascript
fonte
"Use estrito"; é um seguro que o programador não usará as propriedades frouxas ou ruins do JavaScript. É um guia, assim como uma régua o ajudará a fazer linhas retas. "Use Strict" ajudará você a "Codificação direta".
Aqueles que preferem não usar réguas para fazer suas linhas retas geralmente acabam nessas páginas pedindo para que outros depurem seu código.
Acredite em mim. A sobrecarga é insignificante em comparação com o código mal projetado. Doug Crockford, que é desenvolvedor sênior de JavaScript há vários anos, tem um post muito interessante aqui . Pessoalmente, gosto de voltar ao site o tempo todo para garantir que não esqueço minhas boas práticas.
A prática moderna de JavaScript deve sempre evocar o "Use Strict"; pragma. O único motivo pelo qual o Grupo ECMA tornou opcional o modo "Estrito" é permitir que codificadores menos experientes tenham acesso ao JavaScript e, então, tempo para se adaptarem às práticas de codificação novas e mais seguras.
fonte
A inclusão
use strict
no início de todos os arquivos JavaScript sensíveis a partir deste ponto é uma pequena maneira de ser um programador JavaScript melhor e evitar que variáveis aleatórias se tornem globais e as coisas mudem silenciosamente.fonte
Citando w3schools :
Consulte http://www.w3schools.com/js/js_strict.asp para saber mais
fonte
"use strict"
faz com que o código JavaScript seja executado no modo estrito , o que basicamente significa que tudo precisa ser definido antes do uso. O principal motivo para usar o modo estrito é evitar usos globais acidentais de métodos indefinidos.Também no modo estrito, as coisas correm mais rápido, alguns avisos ou avisos silenciosos geram erros fatais; é melhor sempre usá-lo para criar um código mais limpo.
"use strict"
é amplamente necessário para ser usado no ECMA5, no ECMA6 faz parte do JavaScript por padrão , portanto, não precisa ser adicionado se você estiver usando o ES6.Veja estas instruções e exemplos do MDN:
1) modo estrito em funções
2) modo estrito de script inteiro
3) Atribuição a um sistema global não gravável
Você pode ler mais sobre MDN .
fonte
Há uma boa conversa de algumas pessoas que estavam no comitê do ECMAScript: Alterações no JavaScript, Parte 1: ECMAScript 5 " sobre como o uso incremental do
"use strict"
opção permite que os implementadores de JavaScript limpem muitos dos recursos perigosos do JavaScript sem interromper repentinamente todos os sites no mundo.Obviamente, ele também fala sobre o que muitas dessas falhas são (foram) e como o ECMAScript 5 as corrige.
fonte
Pequenos exemplos para comparar:
Modo não estrito:
Modo estrito:
Modo não estrito:
fonte
this === 'a'
nos dois exemplos?Observe que
use strict
foi introduzido no EcmaScript 5 e foi mantido desde então.Abaixo estão as condições para acionar o modo estrito no ES6 e ES7 :
fonte
Os principais motivos pelos quais os desenvolvedores devem usar
"use strict"
são:Impede a declaração acidental de variáveis globais . O uso
"use strict()"
garantirá que as variáveis sejam declaradas comvar
antes do uso. Por exemplo:"use strict"
diretiva é reconhecida apenas no início de um script ou função.A cadeia
"arguments"
não pode ser usada como uma variável:Restringirá o uso de palavras-chave como variáveis. Tentar usá-los gerará erros.
Em resumo, seu código ficará menos propenso a erros e, por sua vez, fará com que você escreva um bom código.
Para ler mais sobre isso, você pode consultar aqui .
fonte
"use strict"; é o esforço da ECMA para tornar o JavaScript um pouco mais robusto. Ele traz ao JS uma tentativa de torná-lo pelo menos um pouco "estrito" (outros idiomas implementam regras estritas desde os anos 90). Na verdade, "força" os desenvolvedores JavaScript a seguir algum tipo de prática recomendada de codificação. Ainda assim, o JavaScript é muito frágil. Não existem variáveis digitadas, métodos digitados, etc. Recomendo vivamente aos desenvolvedores JavaScript que aprendam uma linguagem mais robusta, como Java ou ActionScript3, e que implementem as mesmas práticas recomendadas no código JavaScript, que funcionará melhor e será mais fácil. depurar.
fonte
O modo "estrito" do JavaScript foi introduzido no ECMAScript 5.
Escrever
"use strict";
na parte superior do seu arquivo JS ativa a verificação rigorosa de sintaxe. Ele realiza as seguintes tarefas para nós:mostra um erro se você tentar atribuir a uma variável não declarada
impede que você substitua as principais bibliotecas do sistema JS
proíbe alguns recursos de idioma inseguros ou propensos a erros
use strict
também funciona dentro de funções individuais. É sempre uma prática melhor incluiruse strict
no seu código.Problema de compatibilidade do navegador: as diretivas "use" devem ser compatíveis com versões anteriores. Os navegadores que não os suportam verão apenas uma literal de sequência que não é mais referenciada. Então, eles vão passar por cima e seguir em frente.
fonte
use strict
é uma maneira de tornar seu código mais seguro, porque você não pode usar recursos perigosos que podem não funcionar como o esperado. E, como foi escrito antes, torna o código mais rigoroso.fonte
Use Strict é usado para mostrar erros comuns e repetidos para que sejam tratados de maneira diferente e altera a maneira como o script java é executado, tais alterações são:
Impede globals acidentais
Sem duplicatas
Elimina com
Elimina essa coerção
Avaliação mais segura ()
Erros para imutáveis
você também pode ler este artigo para obter detalhes
fonte
Normalmente, o JavaScript não segue regras rígidas, aumentando assim as chances de erros. Após o uso
"use strict"
, o código JavaScript deve seguir um conjunto estrito de regras, como em outras linguagens de programação, como uso de terminadores, declaração antes da inicialização etc.Se
"use strict"
for usado, o código deve ser escrito seguindo um conjunto estrito de regras, diminuindo as chances de erros e ambiguidades.fonte
"use strict"; Define que o código JavaScript deve ser executado no "modo estrito".
Todos os navegadores modernos suportam "use strict", exceto o Internet Explorer 9 e versões inferiores .
Desvantagem
Se um desenvolvedor usou uma biblioteca que estava no modo estrito, mas o desenvolvedor estava acostumado a trabalhar no modo normal, ele pode chamar algumas ações na biblioteca que não funcionariam conforme o esperado.
Pior ainda, como o desenvolvedor está no modo normal, ele não tem as vantagens de gerar erros extras; portanto, o erro pode falhar silenciosamente.
Além disso, conforme listado acima, o modo estrito impede que você faça certas coisas.
As pessoas geralmente pensam que você não deve usar essas coisas em primeiro lugar, mas alguns desenvolvedores não gostam da restrição e querem usar todos os recursos da linguagem.
Para exemplo básico e para referência, consulte:
https://www.tutorialsteacher.com/javascript/javascript-strict
fonte
O modo estrito pode impedir vazamentos de memória.
Verifique a função abaixo, escrita no modo não estrito:
Nesta função, estamos usando uma variável chamada
name
dentro da função. Internamente, o compilador primeiro verificará se há alguma variável declarada com esse nome específico naquele escopo de função específico. Como o compilador entendeu que não existe essa variável, ele fará o check-in no escopo externo. No nosso caso, é o escopo global. Novamente, o compilador entendeu que também não há variável declarada no espaço global com esse nome, portanto, ele cria uma variável para nós no espaço global. Conceitualmente, essa variável será criada no escopo global e estará disponível em todo o aplicativo.Outro cenário é que, digamos, a variável seja declarada em uma função filho. Nesse caso, o compilador verifica a validade dessa variável no escopo externo, ou seja, a função pai. Só então ele fará o check-in no espaço global e criará uma variável para nós lá. Isso significa que verificações adicionais precisam ser feitas. Isso afetará o desempenho do aplicativo.
Agora vamos escrever a mesma função no modo estrito.
Obteremos o seguinte erro.
Aqui, o compilador lança o erro de referência. No modo estrito, o compilador não nos permite usar a variável sem declará-la. Portanto, vazamentos de memória podem ser evitados. Além disso, podemos escrever um código mais otimizado.
fonte