En su obsesión por alinear los literales numéricos, el desarrollador ha inicializado inadvertidamente la variable b
con un literal octal. El modo no estricto interpretará esto como un literal numérico con valor 24
(en base 10). Sin embargo, el modo estricto arrojará un error.
Para obtener una lista no exhaustiva de especialidades en modo estricto, consulte esta respuesta .
Alcance
Históricamente, JavaScript se ha confundido sobre cómo se definen las funciones. A veces parecen tener un alcance estático, pero algunas características hacen que se comporten como si estuvieran en un alcance dinámico. Esto es confuso, lo que hace que los programas sean difíciles de leer y comprender. El malentendido causa errores. También es un problema para el rendimiento. El alcance estático permitiría que se produzca un enlace variable en tiempo de compilación, pero el requisito de alcance dinámico significa que el enlace debe diferirse al tiempo de ejecución, lo que conlleva una penalización de rendimiento significativa.
El modo estricto requiere que todo el enlace variable se realice de forma estática. Eso significa que las características que anteriormente requerían enlace dinámico deben eliminarse o modificarse. Específicamente, se elimina la instrucción with, y la capacidad de la función eval de alterar el entorno de su interlocutor está severamente restringida.
Uno de los beneficios del código estricto es que las herramientas como YUI Compressor
pueden hacer un mejor trabajo al procesarlo.
Variables globales implícitas
JavaScript ha implicado variables globales. Si no declara explícitamente una variable, una variable global se declara implícitamente por usted. Esto facilita la programación para principiantes porque pueden descuidar algunas de sus tareas básicas de limpieza. Pero hace que la administración de programas más grandes sea mucho más difícil y degrada significativamente la confiabilidad. Entonces, en modo estricto, las variables globales implícitas ya no se crean. Debe declarar explícitamente todas sus variables.
Fuga global
Hay una serie de situaciones que podrían hacer this
que se vincule al objeto global. Por ejemplo, si olvida proporcionar el new
prefijo al llamar a una función de constructor, los del constructor this
se vincularán inesperadamente al objeto global, por lo que en lugar de inicializar un nuevo objeto, en su lugar estará manipulando silenciosamente las variables globales. En estas situaciones, el modo estricto se unirá this
a undefined
, lo que hará que el constructor arroje una excepción, permitiendo que el error se detecte mucho antes.
Fracaso ruidoso
JavaScript siempre ha tenido propiedades de solo lectura, pero no puede crearlas usted mismo hasta que la Object.createProperty
función de ES5 expone esa capacidad. Si intentó asignar un valor a una propiedad de solo lectura, fallaría en silencio. La asignación no cambiaría el valor de la propiedad, pero su programa procedería como si lo hubiera hecho. Este es un peligro para la integridad que puede hacer que los programas entren en un estado inconsistente. En modo estricto, intentar cambiar una propiedad de solo lectura generará una excepción.
Octal
La representación octal (o base 8) de los números fue extremadamente útil cuando se realizaba la programación a nivel de máquina en máquinas cuyos tamaños de palabra eran múltiplos de 3. Se necesitaba octal al trabajar con el mainframe CDC 6600, que tenía un tamaño de palabra de 60 bits. Si pudieras leer octal, podrías mirar una palabra como 20 dígitos. Dos dígitos representaban el código operativo, y un dígito identificaba uno de los 8 registros. Durante la transición lenta de códigos de máquina a lenguajes de alto nivel, se pensó que era útil proporcionar formas octales en lenguajes de programación.
En C, se seleccionó una representación extremadamente desafortunada de octalidad: cero inicial. Entonces, en C, 0100
significa 64, no 100, y 08
es un error, no 8. Aún más desafortunadamente, este anacronismo se ha copiado en casi todos los lenguajes modernos, incluido JavaScript, donde solo se usa para crear errores. No tiene otro propósito. Entonces, en modo estricto, las formas octales ya no están permitidas.
Etcétera
Los argumentos pseudo array se vuelven un poco más parecidos a un array en ES5. En modo estricto, pierde sus callee
y sus caller
propiedades. Esto hace posible pasar su arguments
código no confiable sin renunciar a mucho contexto confidencial. Además, arguments
se elimina la
propiedad de las funciones.
En modo estricto, las claves duplicadas en un literal de función producirán un error de sintaxis. Una función no puede tener dos parámetros con el mismo nombre. Una función no puede tener una variable con el mismo nombre que uno de sus parámetros. Una función no puede tener delete
sus propias variables. Un intento de
delete
una propiedad no configurable ahora arroja una excepción. Los valores primitivos no están implícitamente envueltos.
ECMAScript 5 agrega una lista de palabras reservadas. Si los usa como variables o argumentos, el modo estricto arrojará un error. Las palabras reservadas son: