O Que não é Permitido no ‘Strict Mode’ do Javascript?

A diretiva "use strict"; do JavaScript foi incluída no ECMAScript 5 e define que o código JavaScript será executado em Strict Mode (modo restrito), o que nos obriga a seguir algumas regras de sintaxe para escrevermos um código mais “seguro”.

Porquê Strict Mode?

O JavaScript é uma linguagem extremamente dinâmica e flexível, o que nos permite escrever código sem seguir nenhuma convenção de sintaxe e fazer coisas muito estranhas que em qualquer outra linguagem nunca seria permitido. Como por exemplo usar uma variável sem declará-la antes.

O problema é que essa liberdade toda pode causar comportamentos não esperados no código podendo ser as vezes de difícil identificação e correção.

Com o Strict Mode ativado o JavaScript fica menos flexível e nos obriga a seguir algumas regras. O interpretador do JavaScript irá sempre retornar um erro e travar a execução do código sempre que encontrar alguma dessas más sintaxes no código. O que ele basicamente faz é converter as más sintaxes, antes permitidas, em erros reais. Isso nos dá mais segurança de que nosso código vai se comportar como o esperado.

Como e Onde Declarar o Stric Mode?

O Strict Mode é ativado adicionando o literal “strict mode”; no começo de scripts ou de funções e se aplica apenas ao contexto onde foi inserido. Caso seja inserido no começo do script, será aplicado a todo o código. Caso for incluído no começo de uma função será aplicado apenas dentro da função.

As Más Sintaxes que o Strict Mode não permite

Utilizar variável sem declarar

"use strict";
x = 3.14; // isso vai retornar um erro
obj = {p1:10, p2:20}; // também vale para objetos
var y = 3.14 // ok

Deletar variáveis ou objeto

"use strict";
var x = 3.14;
delete x; // isso vai retornar um erro

Deletar função

"use strict";
function x(p1, p2) {};
delete x; // isso vai retornar um erro

Duplicar nomes de parâmetros

"use strict";
function x(p1, p1) {}; // isso vai retornar um erro

Números em Octal

"use strict";
var x = 010; // isso vai retornar um erro

Caracteres de Escape

"use strict";
var x = \010; // isso vai retornar um erro

Escrever em uma propriedade read-only

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // isso vai retornar um erro

Escrever em uma propriedade get-only

"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14; // isso vai retornar um erro

Deletar uma propriedade que não pode ser deletada

"use strict";
delete Object.prototype; // isso vai retornar um erro

Usar palavras reservadas como ‘arguments’ ou ‘eval’ em nome de variáveis

"use strict";
var eval = 3.14; // isso vai retornar um erro
var arguments = 3.14; // isso também vai retornar um erro
// Isso serve também para as palavras reservadas:
// implements
// interface
// let
// package
// private
// protected
// public
// static
// yield

Usar a declaração while

"use strict";
with (Math){x = cos(2)}; // isso vai retornar um erro

Restrição na função eval()

A função eval() não pode criar variáveis no escopo onde ela é usada

"use strict";
eval ("var x = 2");
alert (x); // a variável 'x' não existe aqui