Depure seu site mais rápido com o modo estrito do ECMAScript

Rajaskharan Vengalil

Microsoft Technical Evangelist

Março 2013

O ECMAScript versão 5 é a revisão mais recente da linguagem de programação ECMAScript ratificada para adoção ampla pela Ecma International – a entidade de padrões responsável por descobrir o que entra na linguagem. Se você estiver imaginando o que exatamente o ECMAScript é e por que deveria se interessar, acontece que o ECMAScript é o "padronês" para uma linguagem que o resto do mundo conhece como JavaScript. A rigor, JavaScript e ECMAScript não são idênticos. O JavaScript é um dialeto do ECMAScript, mas as diferenças são, na maioria, desprezíveis e existem predominantemente por motivos históricos de compatibilidade com versões anteriores. O ECMAScript 5 (daqui para frente mencionado como ES5) traz à mesa um pacote de recursos interessantes, muitos dos quais tendo como objetivo a introdução de maior disciplina de programação na linguagem.

Nesta postagem (e ao longo das seguintes), analisamos um desses recursos que trata diretamente de algumas das partes mais notórias da linguagem. Esse novo recurso é conhecido como "modo estrito" que, brevemente, é um modo de execução totalmente novo para o JavaScript que faz o mecanismo de execução execute código com semântica ligeiramente diferente.

O que é o modo estrito?

“Modo estrito” é uma forma de fazer com que o mecanismo de tempo de execução interprete e execute o JavaScript com semântica diferente do que se vê com código irrestrito. Código executado no modo estrito tem as seguintes características:

  1. Exclui alguns recursos sintáticos e semânticos, isto é, você não pode fazer algumas coisas que normalmente tem permissão de fazer
  2. Modifica a semântica de alguns recursos, ou seja, o mesmo código é executado de forma diferente no modo estrito se comparado com o que acontece no modo irrestrito
  3. Uma lista expandida de cenários que causam erros pode ser reunida em vez de silenciosamente ignorada ou executada com intenção presumida
  4. Aplica-se a unidades de código específicas - isto é, você não aplicar de uma só vez o modo estrito a todos os seus arquivos .js que, no caso, são uma única unidade de código no que diz respeito ao tempo de execução)

O fundamento lógico por trás do modo estrito é a introdução de uma disciplina imposta pelo tempo de execução ao desenvolvimento em JavaScript. Sempre achei o JavaScript dinâmico demais e, em minha opinião, o modo estrito tenta lidar com aquele dinamismo excessivo. Muitas das partes complicadas da linguagem que exigiam disciplina do programador agora são impostas pelo mecanismo quando se marca um determinado segmento do código como "estrito". Você pode identificar o bug no trecho a seguir? Com o "modo estrito" ativado, o tempo de execução identifica!

function findProduct(numbers) {
    var product = 0,
        len = numbers.length;
    for(var i = 0; i < len; ++i) {
        prodct = product * numbers[i];
    }
    return product;
}

Suporte a navegador

Praticamente todos os navegadores modernos suportam o modo estrito em seus respectivos mecanismos JavaScript. No Internet Explorer (IE), o modo estrito está disponível da versão 10 em diante. Você pode baixar a última prévia de plataforma do IE10 do site de test-drive do IE. Todas as amostras neste artigo foram testadas no IE10 Platform Preview 2 (IE10 PP2) usando um console de avaliação JavaScript que eu criei há algum tempo. Amostras selecionadas também foram testadas no Google Chrome 14 e no Firefox 7 beta.

Contextos do modo estrito

Executar uma porção de JavaScript no modo estrito é muito simples. Um exemplo:

"use strict";
alert("Look ma! Strict mode!");

O bom é que isso também é código ECAMScript 3 perfeitamente válido (o ES3 é uma edição anterior do ECMAScript). O que aconteceu com o ES4? Ele tornou-se obsoleto!). Um mecanismo ES3 JavaScript simplesmente ignora a linha noop e prossegue com a execução do resto do script. De fato, esse tipo de compatibilidade sintática com versões anteriores com o ES3 foi uma meta importante de design para o ES5 e uma parte surpreendentemente grande da especificação ES5 pode ser implementada completamente em ES3 JavaScript. O modo estrito, entretanto, é um exemplo de um recurso de ES5 que talvez não possa ser implementado puramente em ES3 JavaScript sem suporte adicional do tempo de execução.

Os tipos de código JavaScript a seguir podem ser executados no modo estrito:

  1. Código global

Esse é basicamente um código executável que você insere em uma marca script.

Por exemplo:

<script>
  "use strict";
  // global strict mode code here
</script>

Note que, com o HTML5, não há mais uma necessidade de se adicionar o atributo type para marcas de script.

  1. Código eval

Código de avaliação que tem o prefixo de diretiva de modo estrito:

eval("'use strict'; // strict code here");
Ou é invocado do código de modo estrito:
"use strict";
eval("// strict code here");
  1. Código function

Funções que têm o prefixo da diretiva de modo estrito antes do resto do código (colocando a diretiva em qualquer outro lugar não conta):

Funções declaradas no código de modo estrito herdam o rigor:

function foo() {
    "use strict";
    var bar = function () {
        // strict code here
    };
    bar();
}

Note que o último caso é particularmente relevante quando se definem callbacks para vários manipuladores de eventos. Note também que o rigor não se estende a todas as pilhas de chamadas. Um exemplo:

function foo() {
    // not strict mode even though
    // foo is being invoked from a
    // "strict" function
}

function bar() {
    "use strict";
    foo();
}

bar();

Mostrar: