Actualizar aplicaciones creadas en versiones anteriores de JScript

Actualización: noviembre 2007

La mayor parte del código de JScript existente funcionará sin problemas con las mejoras incluidas en JScript 8.0 porque JScript 8.0 es casi totalmente compatible con las versiones anteriores. Las nuevas características de JScript 8.0 abarcan nuevas áreas.

De manera predeterminada, los programas de JScript 8.0 se compilan en modo rápido. Puesto que el modo rápido restringe en cierta medida los tipos de código permitidos, los programas pueden ser más eficaces y ejecutarse más rápidamente. Sin embargo, algunas características disponibles en versiones anteriores no están disponibles en modo rápido. En su mayoría, estas características no eran compatibles con las aplicaciones de múltiples subprocesos y generaban un código poco eficaz. Para los programas compilados con el compilador de la línea de comandos, puede desactivar el modo rápido y obtener una compatibilidad total con las versiones anteriores. Observe que el código compilado de este modo es más lento y más susceptible a errores. El modo rápido no se puede desactivar en las aplicaciones de ASP.NET porque se producirían problemas de estabilidad. Para obtener más información, vea /fast.

Modo rápido

En modo rápido, se desencadenan los siguientes comportamientos de JScript:

  • Es preciso declarar todas las variables.

  • Las funciones se convierten en constantes.

  • Los objetos intrínsecos no pueden tener propiedades expando.

  • No se pueden enumerar ni cambiar las propiedades de los objetos intrínsecos.

  • El objeto arguments no está disponible.

  • No se puede asignar a un método, un campo o una variable de sólo lectura.

  • El método eval no puede definir identificadores en el ámbito que lo contiene.

  • El método eval ejecuta las secuencias de comandos en un contexto de seguridad restringido.

Es preciso declarar todas las variables

Las versiones anteriores de JScript no requerían la declaración explícita de variables. Si bien está característica hace que los programadores tengan que escribir menos caracteres, dificulta el seguimiento de los errores. Por ejemplo, se puede asignar un valor a un nombre de variable mal escrito, lo que no generaría un error ni devolvería el resultado deseado. Además, las variables no declaradas tienen un ámbito global, lo que puede originar más confusión.

El modo rápido requiere declaraciones explícitas de variables. Esto ayuda a evitar los tipos de error anteriormente mencionados y genera código que se ejecuta con mayor rapidez.

JScript .NET también admite variables con anotación de tipo. Esto enlaza cada variable con un tipo de datos concreto y la variable puede guardar sólo datos de ese tipo. Aunque la anotación de tipos no es necesaria, su uso ayuda a evitar errores asociados con el almacenamiento accidental de datos erróneos en una variable y puede aumentar la velocidad de ejecución del programa.

Para obtener más información, vea Variables y constantes de JScript.

Las funciones se convierten en constantes

En versiones anteriores de JScript, las funciones declaradas con la instrucción function se trataban igual que las variables que contenían un objeto Function. En concreto, se podía utilizar cualquier identificador de función como variable para guardar cualquier tipo de datos.

En modo rápido, las funciones se convierten en constantes. En consecuencia, a las funciones no se les pueden asignar nuevos valores ni se pueden redefinir. De esta manera, se impide que se cambie accidentalmente el significado de una función.

Si la secuencia de comandos requiere un cambio de función, puede usar de manera explícita una variable para que contenga una instancia del objeto Function. Observe, sin embargo, que los objetos Function son lentos. Para obtener más información, vea Function (Objeto).

Los objetos intrínsecos no pueden tener propiedades expando

En versiones anteriores de JScript, se podían agregar propiedades expando a los objetos intrínsecos. Este comportamiento se podía utilizar para agregar un método a un objeto String, por ejemplo, con el fin de quitarle espacios iniciales a la cadena.

Esto no está permitido en el modo rápido. Si la secuencia de comandos depende de esta característica, deberá modificarla. Puede definir funciones en el ámbito global en lugar de asociar dichas funciones como métodos a los objetos. A continuación, vuelva a escribir cada instancia en la secuencia de comandos en que se llama a un método expando desde el objeto para que el objeto pase a la función adecuada.

Una excepción significativa a esta regla es el objeto Global, que puede seguir teniendo propiedades expando. Todos los identificadores del ámbito global son en realidad propiedades del objeto Global. Naturalmente, el objeto Global tiene que ser extensible dinámicamente para admitir la adición de nuevas variables globales.

No se pueden enumerar ni cambiar las propiedades de los objetos intrínsecos

En las versiones anteriores de JScript, se podía eliminar o enumerar las propiedades predefinidas de los objetos intrínsecos o incluso o escribir en ellas. Este comportamiento podía utilizarse para cambiar, por ejemplo, el método toString predeterminado del objeto Date.

Esto no está permitido en el modo rápido. Esta característica ya no es necesaria, puesto que los objetos intrínsecos no pueden tener propiedades expando y las propiedades de cada objeto se enumeran en la sección de referencia. Para obtener más información, vea Objetos.

El objeto arguments no está disponible

Las versiones anteriores de JScript proporcionaban un objeto arguments dentro de las definiciones de función, que permitía que las funciones aceptaran un número arbitrario de argumentos. El objeto arguments facilitaba también una referencia a la función actual y a la función de llamada.

El objeto arguments no está disponible en modo rápido. Sin embargo, JScript 8.0 permite que las declaraciones de función especifiquen una matriz de parámetros en la lista de parámetros de funciones. Esto permite que la función acepte un número arbitrario de argumentos, con lo que reemplaza parte de la funcionalidad del objeto arguments. Para obtener más información, vea function (Instrucción).

No hay ninguna forma de tener acceso ni hacer referencia directamente a la función actual o a la función de llamada en el modo rápido.

No se puede asignar a un método, un campo o una variable de sólo lectura

En las versiones anteriores de JScript, parecía que las instrucciones podían asignar un valor a un identificador de sólo lectura. La asignación producía un error que podía pasar desapercibido y la única forma de advertir el error de la asignación era comprobar si el valor había cambiado realmente. La asignación de valores a los identificadores de sólo lectura se hace normalmente por error, ya que no surte ningún efecto.

En modo rápido, se genera un error de tiempo de compilación si se trata de asignar un valor a un identificador de sólo lectura. Puede eliminar la asignación o tratar de asignar un valor a un identificador que no sea de sólo lectura.

Si desactiva el modo rápido, las asignaciones a identificadores de sólo lectura producirán errores que no se perciben en tiempo de ejecución, pero en tiempo de compilación aparecerá una advertencia.

El método eval no puede definir identificadores en el ámbito que lo contiene

En las versiones anteriores de JScript, las funciones y variables se podían definir en el ámbito local o global mediante una llamada al método eval.

En modo rápido, las funciones y variables se pueden definir en una llamada al método eval, pero son accesibles desde esa llamada concreta. Una vez que termina el método eval, las funciones y variables definidas en el método eval ya no están accesibles. El resultado de un cálculo realizado dentro de un método eval se puede asignar a cualquier variable que esté accesible en el ámbito actual. Las llamadas al método eval son lentas y se recomienda volver a escribir el código que las contenga.

El comportamiento anterior del método eval se restaura si se desactiva el modo rápido.

El método eval ejecuta las secuencias de comandos en un contexto de seguridad restringido

En las versiones anteriores de JScript, el código que se pasa al método eval se ejecutaría en el mismo contexto de seguridad que el código de llamada.

Para ayudar a proteger a los usuarios, el código que se pasa al método eval se ejecuta en un contexto de seguridad restringido, a menos que se pase la cadena "unsafe" como segundo parámetro. El contexto de seguridad restringido prohíbe el acceso a los recursos del sistema, como el sistema de archivos, la red o la interfaz de usuario. Si el código intenta obtener acceso a estos recursos, se genera una excepción de seguridad.

Si el segundo parámetro de eval es la cadena "unsafe", el código que se pasa al método eval se ejecuta en el mismo contexto de seguridad que el código de llamada. De esta forma, se restaura el comportamiento anterior del método eval.

Nota de seguridad:

Utilice eval en modo no seguro sólo para ejecutar cadenas de código obtenidas de orígenes conocidos.

Vea también

Conceptos

Introducción a JScript 8.0 para programadores de JScript

Referencia

/fast

Otros recursos

Introducción a JScript