Carregando...

Modo estrito

O modo estrito recusa alguns erros que antes passavam calados. "use strict" fica no início. Aí size = "regular", sem let e sem const, não cria um global: o motor lança ReferenceError. A linha desta página é ReferenceError.

Nem a lista, nem a página dos erros

A lista de tarefas parou em done: buy tea. A página dos erros lançou new Error("missing size") de propósito, e catch leu essa mensagem. Aqui você não lança um Error seu. O motor lança, porque size nunca foi declarado. console.error continua sem lançar.

Onde a diretiva vale

"use strict" só funciona como primeira instrução do script, ou como primeira instrução dentro de uma função. Uma string mais adiante não muda nada. Uma função pode ser estrita e o resto não. Os módulos já são estritos, então a diretiva ali é redundante.

O que setSize faz

setSize atribui size sem declará-lo. A chamada está em try. Nenhum size global é criado.

Atribuição sem declaração

javascript
"use strict";
function setSize() {
size = "regular";
}
try {
setSize();
} catch (error) {
console.log(error.name);
}

O registo é ReferenceError. A correção é let size = "regular". Com drink em tea e esse size declarado, label pode devolver tea / regular. Escrever order.size é a outra correção que vale, porque esse nome existe.

Chamar pelo nome ou chamar o método

Chamar a função pelo nome não define this. No modo estrito this é undefined. Chamar o método em order define this como esse objeto, portanto this.drink é tea.

this numa chamada bare

javascript
"use strict";
function bare() {
return this;
}
const order = {
drink: "tea",
label() {
return this.drink;
}
};
console.log(bare());
console.log(order.label());

Os registos são undefined e depois tea. Não leia this.drink dentro de bare. Não há objeto, e essa leitura lança.

Quatro diferenças

À esquerda está o comportamento silencioso antigo. À direita está o efeito da diretiva.

📊 O que a diretiva muda

Comportamento silencioso antigo Com "use strict"
size = "regular" sem declaração cria um global ReferenceError
this em bare é o objeto global undefined
Parâmetro repetido, o último vence SyntaxError
delete numa variável declarada devolve false SyntaxError

Um parâmetro repetido, ou delete size, falha enquanto o script é lido: é SyntaxError, e try não o apanha. O ReferenceError da atribuição acontece quando a função corre, por isso catch o vê. delete order.drink continua permitido nos dois modos se a propriedade puder ser removida.

A página

A página é um único script estrito. A atribuição falha e o nome do erro é escrito na página.

Página com ReferenceError

html
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
"use strict";
const line = document.querySelector("#line");
try {
size = "regular";
} catch (error) {
line.textContent = error.name;
}
</script>
</body>
</html>

A linha lê-se ReferenceError. Não é done: buy tea. Não é caught / missing size. Ponha let antes de size e este catch deixa de correr.

Cinco passos curtos

  1. Corra setSize sob "use strict". O registo é ReferenceError.
  2. Mude a atribuição para let size = "regular". O lançamento some.
  3. Chame bare(). O valor é undefined.
  4. Chame order.label(). O valor é tea.
  5. Leia a página. A linha é ReferenceError.

Erros que acontecem mesmo

  • Pôr a diretiva depois de outra instrução
  • Esperar que uma atribuição sem declaração crie um global
  • Ler this.drink dentro de uma chamada bare
  • Apanhar um parâmetro repetido com try
  • Ler a linha como done: buy tea
  • Lê-la como caught / missing size

Guarde isto

  • A diretiva primeiro
  • size = "regular" sem declaração lança ReferenceError
  • this em bare é undefined, e order.label() devolve tea
  • Parâmetros repetidos e delete numa variável são SyntaxError
  • A linha da página é ReferenceError

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

❓
6
Perguntas
🎯
70%
Para Passar
♾️
∞
Tempo
🔄
∞
Tentativas

📝 Instruções

  • Leia cada pergunta cuidadosamente
  • Selecione a melhor resposta para cada pergunta
  • Você pode refazer o quiz quantas vezes quiser
  • Seu progresso será mostrado no topo