Modo estricto Llega A La Ciudad

14 de diciembre de 2010 a las 14:12 por Douglas Crockford | En Desarrollo | 20 Comentarios

Este es el tiempo y una época cuando la gente de todo el mundo se olvide de sus diferencias y se unan en paz y hermandad para celebrar el primer aniversario de la aprobación de la Asamblea General de ECMA de ECMAScript El lenguaje de programación estándar, Quinta Edición. La característica más importante en la ES5 es el modo estricto de nuevo. Modo estricto es un modo opt-in que las reparaciones o elimina algunas de las características más problemáticas de la lengua.

Especificación de modo estricto

Existen dos maneras de solicitar modo estricto. El primero es insertar este pragma

  "Use strict"; 

en la parte superior de un archivo o unidad de compilación. Se debe aparecer antes de cualquier otra declaración, pero puede ser precedido por espacios en blanco y comentarios. Tiene la forma de una declaración literal de cadena inútil, por lo que será ignorado por los sistemas de ES3. Esto significa que es posible escribir programas ES5/strict que también se pueden ejecutar en los navegadores más antiguos. Estricto código también puede interactuar con las organizaciones no estricta (o mal) de código, por lo que las funciones estrictas puede llamar a las funciones descuidadas, y las funciones descuidadas pueden llamar a las funciones estrictas. Este alto nivel de compatibilidad hace que la adopción de modo estricto fácil.

Todo el código en el archivo o la unidad de compilación con el "use strict"; exposición de motivos será procesado como código estricto. Hay un problema, sin embargo. Consideraciones sobre el rendimiento en la actualidad nos obligan a concatenar varios archivos JavaScript en conjunto para evitar los retrasos acumulados HTTP. Si un archivo con un "use strict"; exposición de motivos tiene código descuidado se le ha añadido, el código descuidado será procesado como un estricto y probablemente se producirá un error. Hay una regla muy fácil: No mezcle estricta y descuidado en el mismo archivo, pero ya hemos visto algunos sitios famosos de obtener este mal.

La segunda forma consiste en insertar el pragma es la primera declaración de una función. Que declara que toda la función será estricta, incluidas las funciones que están anidados dentro de él. Rigor ámbito de la función los aspectos, el código tan estricto y el código descuidado se pueden mezclar en el mismo archivo. Esta segunda forma funciona muy bien con el patrón del módulo y sus muchas variaciones. La segunda forma es preferible porque evita el peligro de concatenación.

  (Function () {
    "Use strict";
    / / Esta función es estricta ...
 } ());

 (Function () {
    / / Pero esta función es descuidada ...
 } ()); 

Alcance

Históricamente, JavaScript se ha confundido acerca de cómo las funciones están en el ámbito. A veces parecen estar estáticamente ámbito, pero algunas características hacen que se comporten como si estuvieran de forma dinámica con ámbito. Esto es confuso, por lo que los programas difíciles de leer y entender. El malentendido hace que los insectos. También es un problema para el rendimiento. Estática de alcance variable de unión permitiría a suceder en tiempo de compilación, pero el requisito de alcance dinámico significa que el enlace debe ser aplazado hasta tiempo de ejecución, que viene con una penalización de rendimiento significativa.

El modo estricto requiere que todas las variables de unión se realiza de forma estática. Eso significa que las características que antes requerían enlace dinámico debe ser eliminada o modificada. En concreto, la sentencia with se elimina, y la eval función de la capacidad de alterar el medio ambiente de la persona que llama está severamente restringido.

Una de las ventajas del código estricta es que herramientas como YUI Compressor puede hacer un mejor trabajo cuando el procesamiento.

Que implica variables globales

JavaScript ha implicado variables globales. Si usted no declara explícitamente una variable, una variable global se declara implícitamente para usted. Esto facilita la programación para los principiantes, ya que puede pasar por alto algunas de sus tareas domésticas básicas. Sin embargo, hace que la gestión de los programas de mayor envergadura mucho más difícil y se degrada en forma significativa la fiabilidad. Así que en modo estricto, implícitas variables globales ya no se crean. Usted debe declarar explícitamente todas las variables.

Fuga Mundial

Hay un número de situaciones que podrían causar que this estar vinculado al objeto global. Por ejemplo, si usted se olvida de proporcionar el new prefijo al llamar a una función de constructor, el constructor es this quedará obligado inesperadamente al objeto global, así que en vez de inicializar un nuevo objeto, en su lugar será en silencio la manipulación de las variables globales. En estas situaciones, el modo estricto en cambio, se unen this a undefined , lo que hará que el constructor se producirá una excepción en su lugar, permitiendo que el error se detecta mucho antes.

El fracaso ruidoso

JavaScript siempre ha tenido propiedades de sólo lectura, pero no se podía crear usted mismo hasta el ES5 de Object.createProperty función expuesta esa capacidad. Si se intenta asignar un valor a una propiedad de sólo lectura, que fracasaría en silencio. La tarea no iba a cambiar el valor de la propiedad, pero el programa se procederá como si lo tenía. Este es un riesgo que puede causar la integridad de los programas para entrar en un estado incoherente. En modo estricto, el intento de cambiar una propiedad de sólo lectura se producirá una excepción.

Octal

El octal (base 8) la representación de los números era muy útil cuando se hace a nivel de máquina de programación en las máquinas cuya palabra tamaños eran un múltiplo de 3. Usted necesita octal cuando se trabaja con el CDC 6600 de mainframe, que tenía un tamaño de palabra de 60 bits. Si pudieras leer octal, se puede mirar una palabra hasta 20 dígitos. Dos dígitos representan el código de operación, y una de un dígito identificado de 8 registros. Durante la lenta transición desde los códigos de la máquina para lenguajes de alto nivel, se piensa que es útil para proporcionar formas octales en lenguajes de programación.

En C, una representación muy desafortunada de octalness fue seleccionado: cero a la izquierda. Así en C, 0100 significa 64 no, 100, y 08 es un error no, 8. Aún más, lamentablemente, este anacronismo se ha copiado en casi todas las lenguas modernas, como JavaScript, donde sólo se utiliza para crear errores. No tiene ningún otro propósito. Así que en modo estricto, las formas octales ya no se permite.

Etcétera

El arguments pseudo-matriz se convierte en un poco más amplia, como en ES5. En modo estricto, pierde su callee y la caller propiedades. Esto hace posible para pasar sus arguments en el código no es de confianza, sin renunciar a una gran cantidad de contexto confidencial. Además, el arguments característica de funciones se elimina.

En modo estricto, duplicados de las llaves en un literal de función va a producir 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 delete sus propias variables. Un intento de delete una propiedad que no puede configurarse hoy inicia una excepción. Los valores primitivos no están implícitamente envuelta.

Si el programa pasa JSLint , es probable que funcione en modo estricto.

Todavía es un mundo imperfecto

Todavía hay problemas en JavaScript que el modo estricto no se aborda. Por ejemplo, coma inserción es todavía un peligro, y 0,1 + 0,2 no es todavía igual a 0,3. La corrección de estos problemas tendrá que esperar a futuras ediciones.

Por qué es importante El modo estricto

Además de los beneficios obvios para la fiabilidad y la legibilidad del programa, el modo estricto está ayudando a resolver el problema de Mashup. Queremos ser capaces de invitar a código de terceros en nuestras páginas para hacer cosas útiles para nosotros y para nuestros usuarios, sin dar más que el código de la licencia para asumir el control del navegador o tergiversar a sí misma para el usuario o nuestros servidores. Tenemos que limitar el código de terceros. Sistemas como Caja de Google hace esto, pero a un costo significativo en el rendimiento y la incomodidad. Mi propia AdSafe sistema también hace esto, pero a costa de la eliminación de this y [] el subíndice de la lengua, lo que puede hacer que la adopción difícil. El modo estricto, nos permite hacer que el código de terceros con la comodidad y el rendimiento de AdSafe y la expresividad de la Caja. Esto será muy importante que nuestros sitios se vuelven más complejas y más conectados.

El modo estricto no resuelve el problema de XSS. La solución a este problema depende de la W3C que tienen alguna acción positiva .

ES5/strict está ahora en la vista previa, y pronto será equipamiento de serie en todos los navegadores compatibles con las normas en todas partes.

Compartir y ampliar: Marcar página con del.icio.us | Digg It! | reddit!

20 Comentarios

  1. como post impresionante de costumbre! ES5 es el futuro .. Object.create (), Object.defineProperty (), Object.isExtensible (), Array.isArray (), soporte nativo para JSON son grandes características .. mirando AdSafe, parece prometedor

    Comentario por Sebastián Armeli - 14 de diciembre 2010 #

  2. Si arguments.callee está fuera, ¿hay otra manera de hacer referencia a una lambda de su cuerpo?

    Comentario por Arieh - 15 de diciembre 2010 #

  3. ¿Hay navegadores (beta o no) que son compatibles con el modo totalmente estricto?

    Comentario por Nate - 15 de diciembre 2010 #

  4. @ Arieh, sí -

    var carl = function bob(a) {
    if (!a) { bob(1); } // reference scoped to inside this function
    alert(carl === bob); // gotcha - true in all browsers but false in ie...
    };

    Comentario por Chris - 15 de diciembre 2010 #

  5. Arieh: Usted puede nombrar a las expresiones de función y referirse a ellos con ese nombre. por ejemplo, var x = function lookMaNoYCombinator(a, b) { if (a === 0) return a + b; else return lookMaNoYCombinator(a - 1, b) }

    Comentario por Sami Samhuri - 15 de diciembre 2010 #

  6. @ Arieh: usted debe utilizar un lambda nombre si quieres recurse. por ejemplo. (La función f () {f ()}). Esto también tiene la ventaja de que no consolidaciones objeto arguments para | esto |

    Comentario por Oliver - 15 de diciembre 2010 #

  7. @ Nate: nightly builds de WebKit y Firefox deben cumplir tanto el modo estricto, y que a todos nos aprecian errores que se presentaron, si detecta cualquier (a http://bugs.webkit.org y http://bugs.mozilla.org)

    Comentario por Oliver - 15 de diciembre 2010 #

  8. Un gráfico que muestra una gran ES5 la compatibilidad en distintos navegadores se puede encontrar aquí: http://kangax.github.com/es5-compat-table/

    Comentario por Jimmy - 15 de diciembre 2010 #

  9. 'Con' y la inyección eval en realidad no aplicar enlace dinámico . Incluso ES3 completa utiliza el enlace léxica (aunque no necesariamente estática vinculante) en todos los casos. Estas características fueron sin duda confuso, sin embargo.

    Comentario por David Hopwood, Sarah - 16 de diciembre 2010 #

  10. Hola Douglas,

    Buena visibilidad, gracias. Además, estoy seguro de que sus lectores se interesarán en la descripción detallada de modo estricto: http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/

    PD: un par de adiciones o correcciones:

    Una función no puede tener una variable con el mismo nombre que uno de sus parámetros.

    Está bien tener una declaración de variable con el mismo nombre como uno de los argumentos. Técnicamente, la declaración se acaba de saltar, puesto que ya se declaró a través de la unión argumento.

    Una función no puede eliminar sus propias variables.

    Siempre ha sido así - las variables (excepción hecha de las que se crean utilizando eval contexto) siempre tienen {} en DontDelete ES3 / [[configurable]] = false en ES5. Es decir, no es posible eliminar una variable sin tener en cuenta el modo estricto.

    Dmitry.

    Comentario por Dmitry A. Soshnikov - 17 de diciembre 2010 #

  11. Se YUI3 "use strict" a sus módulos?

    Comentario por David - 17 de diciembre 2010 #

  12. Hola Douglas,

    Estoy confundido acerca de por debajo de la declaración de su cargo.

    "El modo estricto requiere que todas las variables de unión se realiza de forma estática. Eso significa que las características que antes requerían enlace dinámico debe ser eliminado o modificado "

    palabra "esto" - ¿Tiene dinámica vinculantes o léxica (estático)?

    Si se tiene enlace dinámico, lo que quiere decir que deben dejar de usar "esto" en modo estricto?

    Estoy muy confundido. Comencé a aprender JavaScript desde el último mes a partir de presentaciones de vídeo. Son muy, muy servicial. Este es mi primer lenguaje de programación. Puede ser mi duda es muy raro aquí.

    Pero sólo quiero saber de ti en 'este' lugar a dudas.

    Gracias

    Comentario por ekanna - 28 de diciembre 2010 #

  13. En modo estricto, la forma de este método se une al objeto como antes. La forma de la función se une esto a indefinido, no el objeto global.

    Comentario por Douglas Crockford - 29 de diciembre 2010 #

  14. Dmitry, que se acaba de describir el caso de que usted puede hacer las variables que a continuación, puede eliminar! La sintaxis del operador delete permite para las variables exactamente para ese caso. Pero no más.

    Y David, Sarah, los pelos que están dividiendo son bastante cortos.

    Comentario por Douglas Crockford - 29 de diciembre 2010 #

  15. Gracias Douglas.

    Comentario por ekanna - 07 de enero 2011 #

  16. Lo desea, puede corregir error tipográfico en "El fracaso ruidoso"-la sección "CreateProperty" debe ser "DefineProperty".

    Comentario por Travis - 11 de enero 2011 #

  17. "Estrictamente impresionante"

    Comentario por Franz enzenhofer - 13 de enero 2011 #

  18. Crockford rockz!

    Comentario por Marc Draco - 20 de enero 2011 #

  19. Así que, cuando se YUI Compressor dejen de lanzar el "uso estricto"; pragma del código durante minifaction? :)

    Comentario por marcoos - 03 de febrero 2011 #

  20. s / minifaction / minificación /

    Comentario por marcoos - 03 de febrero 2011 #

Disculpa, los comentarios están cerrados en este momento.

Presentado por Yahoo!

Copyright © 2006-2012 Yahoo! Inc. Todos los derechos reservados. Política de privacidad - Condiciones del servicio

Desarrollado por WordPress en Yahoo! Web Hosting .