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 valor 24
(na base 10). No entanto, o modo estrito gera um erro.
Escopo
Historicamente, o JavaScript ficou confuso sobre como as funções são definidas no escopo. Às vezes, eles parecem ter escopo estaticamente, mas alguns recursos os fazem se comportar como se tivessem um escopo dinâmico. Isso é confuso, tornando os programas difíceis de ler e entender. Incompreensão causa bugs. Também é um problema para o desempenho. O escopo estático permitiria que a ligação variável acontecesse no tempo de compilação, mas o requisito para o escopo dinâmico significa que a ligação deve ser adiada para o tempo de execução, o que vem com uma penalidade de desempenho significativa.
O modo estrito exige que toda a associação de variáveis seja feita estaticamente. Isso significa que os recursos que anteriormente exigiam ligação dinâmica devem ser eliminados ou modificados. Especificamente, a instrução with é eliminada e a capacidade da função eval de violar o ambiente do chamador é severamente restrita.
Um dos benefícios do código estrito é que ferramentas como o YUI Compressor
podem fazer um trabalho melhor ao processá-lo.
Variáveis globais implícitas
JavaScript implicou variáveis globais. Se você não declarar explicitamente uma variável, uma variável global será implicitamente declarada para você. Isso facilita a programação para iniciantes, porque eles podem negligenciar algumas de suas tarefas domésticas básicas. Mas torna o gerenciamento de programas maiores muito mais difícil e diminui significativamente a confiabilidade. Portanto, no modo estrito, as variáveis globais implícitas não são mais criadas. Você deve declarar explicitamente todas as suas variáveis.
Vazamento global
Há várias situações que podem causar this
a vinculação ao objeto global. Por exemplo, se você esquecer de fornecer o new
prefixo ao chamar uma função de construtor, os construtores this
serão vinculados inesperadamente ao objeto global; portanto, em vez de inicializar um novo objeto, ele será violado silenciosamente com variáveis globais. Nessas situações, o modo estrito será vinculado this
ao undefined
, o que fará com que o construtor lance uma exceção, permitindo que o erro seja detectado muito antes.
Falha ruidosa
O JavaScript sempre teve propriedades somente leitura, mas você não pode criá-las até que a Object.createProperty
função do ES5 exponha esse recurso. Se você tentasse atribuir um valor a uma propriedade somente leitura, ela falharia silenciosamente. A atribuição não alteraria o valor da propriedade, mas seu programa continuaria como se tivesse. Esse é um risco à integridade que pode fazer com que os programas entrem em um estado inconsistente. No modo estrito, a tentativa de alterar uma propriedade somente leitura gera uma exceção.
Octal
A representação de números octal (ou base 8) foi extremamente útil ao programar em nível de máquina em máquinas cujo tamanho de palavras era múltiplo de 3. Você precisava de octal ao trabalhar com o mainframe CDC 6600, que tinha tamanho de palavra de 60 bits. Se você pudesse ler octal, poderia ver uma palavra com 20 dígitos. Dois dígitos representavam o código operacional e um dígito identificou um dos oito registros. Durante a lenta transição dos códigos de máquina para as linguagens de alto nível, considerou-se útil fornecer formas octais nas linguagens de programação.
Em C, foi selecionada uma representação extremamente lamentável da octalidade: Zero inicial. Então, em C, 0100
significa 64, não 100, e 08
é um erro, não 8. Ainda mais infelizmente, esse anacronismo foi copiado em quase todas as linguagens modernas, incluindo JavaScript, onde é usado apenas para criar erros. Não tem outro propósito. Portanto, no modo estrito, as formas octais não são mais permitidas.
Et cetera
Os argumentos pseudo-matriz se tornam um pouco mais parecidos com uma matriz no ES5. No modo estrito, perde suas
propriedades callee
e caller
. Isso torna possível transmitir seu arguments
código não confiável sem abrir mão de muito contexto confidencial. Além disso, a
arguments
propriedade das funções é eliminada.
No modo estrito, chaves duplicadas em um literal de função produzirão um erro de sintaxe. Uma função não pode ter dois parâmetros com o mesmo nome. Uma função não pode ter uma variável com o mesmo nome que um de seus parâmetros. Uma função não pode ter delete
suas próprias variáveis. Uma tentativa de
delete
uma propriedade não configurável agora lança uma exceção. Valores primitivos não são implicitamente agrupados.
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: