Share via


Mise à niveau d'applications créées dans des versions précédentes de JScript

Mise à jour : novembre 2007

La majeure partie du code JScript existant fonctionnera correctement avec les améliorations apportées à JScript 8.0, car ce dernier assure une compatibilité descendante presque complète avec les versions précédentes. Les nouvelles fonctionnalités de JScript 8.0 portent sur de nouveaux domaines.

Par défaut, les programmes JScript 8.0 sont compilés en mode rapide. Dans la mesure où le mode rapide impose certaines restrictions quant aux types de code autorisés, les programmes peuvent s'exécuter plus rapidement et plus efficacement. Toutefois, certaines fonctionnalités disponibles dans les versions précédentes ne le sont pas en mode rapide. La plupart de ces fonctionnalités étaient incompatibles avec des applications multithread et généraient un code peu efficace. Pour les programmes compilés avec le compilateur de ligne de commande, vous pouvez désactiver le mode rapide et bénéficier ainsi d'une compatibilité descendante totale. Notez que le code compilé de cette façon est plus lent et plus susceptible de comporter des erreurs. Il n'est pas possible de désactiver le mode rapide dans les applications ASP.NET en raison des problèmes de stabilité qui en résulteraient. Pour plus d'informations, consultez /fast.

Mode rapide

Le mode rapide déclenche les comportements suivants dans JScript :

  • Toutes les variables doivent être déclarées.

  • Les fonctions deviennent des constantes.

  • Les objets intrinsèques ne peuvent avoir de propriétés expando.

  • Les objets intrinsèques ne peuvent avoir de propriétés répertoriées ou modifiées.

  • L'objet arguments n'est pas disponible.

  • Il est impossible d'assigner une valeur à une variable, un champ ou une méthode en lecture seule.

  • La méthode eval ne peut pas définir des identificateurs dans la portée englobante.

  • La méthode eval exécute des scripts dans un contexte de sécurité restreint.

Toutes les variables doivent être déclarées

Les versions précédentes de JScript n'exigeaient pas de déclaration explicite des variables. Même si cette fonctionnalité réduit, pour les programmeurs, le nombre de frappes au clavier, elle rend également plus difficile la localisation des erreurs. Si, par exemple, vous assignez une valeur à un nom de variable mal orthographié, cela ne génère pas d'erreur, mais cela ne retourne pas non plus le résultat escompté. Par ailleurs, les variables non déclarées ont une portée globale, ce qui risque encore plus de prêter à confusion.

Le mode rapide exige des déclarations de variables explicites. Vous évitez ainsi les types d'erreur mentionnés précédemment et vous disposez d'un code à l'exécution plus rapide.

JScript .NET prend également en charge l'annotation de type des variables. Celle-ci lie chaque variable à un type de données particulier et cette variable ne peut stocker que des données de ce type. Même si l'annotation de type n'est pas requise, son utilisation peut contribuer à éviter les erreurs liées au stockage accidentel de données incorrectes dans une variable et permet d'augmenter la vitesse d'exécution du programme.

Pour plus d'informations, consultez Variables et constantes JScript.

Les fonctions deviennent des constantes

Dans les versions précédentes de JScript, les fonctions déclarées avec l'instruction function étaient considérées comme des variables qui contenaient un objet Function. Plus précisément, il était possible d'utiliser n'importe quel identificateur de fonction comme une variable pour y stocker n'importe quel type de données.

En mode rapide, les fonctions deviennent des constantes. Dès lors, il n'est plus possible de leur assigner de nouvelles valeurs ou de les redéfinir. Vous évitez ainsi de modifier accidentellement la signification d'une fonction.

Si votre script exige la modification d'une fonction, vous pouvez utiliser explicitement une variable pour stocker une instance de l'objet Function. Notez toutefois que les objets Function sont lents. Pour plus d'informations, consultez Function, objet.

Les objets intrinsèques ne peuvent avoir de propriétés expando

Dans les versions précédentes de JScript, vous pouviez ajouter des propriétés expando aux objets intrinsèques. Ce comportement permettait, par exemple, d'ajouter une méthode à un objet String pour supprimer les espaces à gauche d'une chaîne.

Cette opération est impossible en mode rapide. Si votre script utilise cette fonctionnalité, vous devez le modifier. Vous pouvez définir des fonctions dans la portée globale au lieu de les attacher à des objets en tant que méthodes. Ensuite, réécrivez, dans le script, chaque instance dans laquelle une méthode expando est appelée à partir de l'objet afin que l'objet soit passé à la fonction appropriée.

La principale exception à cette règle est l'objet Global, qui peut toujours avoir des propriétés expando. Tous les identificateurs figurant dans la portée globale constituent en fait des propriétés de l'objet Global. Il faut, bien entendu, que l'objet Global puisse être étendu de façon dynamique afin de pouvoir prendre en charge l'ajout de nouvelles variables globales.

Les objets intrinsèques ne peuvent avoir de propriétés répertoriées ou modifiées

Dans les versions précédentes de JScript, vous pouviez supprimer des propriétés prédéfinies des objets intrinsèques, les énumérer ou encore écrire dans celles-ci. Ce comportement permettait notamment de modifier la méthode toString par défaut de l'objet Date.

Cette opération est impossible en mode rapide. La fonctionnalité n'est plus nécessaire dans la mesure où les objets intrinsèques ne peuvent avoir de propriétés expando et où les propriétés de chaque objet sont répertoriées dans la section référence. Pour plus d'informations, consultez Objets.

L'objet arguments n'est pas disponible

Les versions précédentes de JScript fournissaient un objet arguments au sein des définitions de fonctions, ce qui permettait aux fonctions d'accepter un nombre arbitraire d'arguments. L'objet arguments fournissait également une référence à la fonction en cours ainsi qu'à la fonction appelante.

L'objet arguments n'est pas disponible en mode rapide. En revanche, JScript 8.0 permet aux déclarations de fonction de spécifier un tableau de paramètres dans la liste des paramètres de la fonction. Dès lors, la fonction peut accepter un nombre arbitraire d'arguments et remplace ainsi en partie la fonctionnalité de l'objet arguments. Pour plus d'informations, consultez function, instruction.

En mode rapide, il n'existe aucun moyen d'accéder directement à la fonction en cours ou à la fonction appelante et de la référencer.

Il est impossible d'assigner une valeur à une variable, un champ ou une méthode en lecture seule

Dans les versions précédentes de JScript, les instructions pouvaient tenter d'assigner une valeur à un identificateur en lecture seule. L'assignation échouait en silence et la seule manière de se rendre compte de l'échec de l'assignation consistait à tester la valeur pour voir si elle avait changé. L'assignation à un identificateur en lecture seule est généralement le résultat d'une erreur puisqu'elle n'a aucun effet.

En mode rapide, une erreur de compilation est générée si vous tentez d'assigner une valeur à un identificateur en lecture seule. Vous pouvez supprimer l'assignation ou tenter d'assigner une valeur à un identificateur qui n'est pas en lecture seule.

Si vous désactivez le mode rapide, les assignations à des identificateurs en lecture seule échouent en silence au moment de l'exécution, mais génèrent un avertissement au moment de la compilation.

La méthode eval ne peut pas définir des identificateurs dans la portée englobante

Dans les versions précédentes de JScript, les fonctions et les variables pouvaient être définies dans la portée locale ou globale en appelant la méthode eval.

En mode rapide, les fonctions et les variables peuvent être définies au sein d'un appel à la méthode eval, mais elles sont uniquement accessibles à partir de cet appel particulier. Une fois eval terminé, les fonctions et les variables définies dans la méthode eval ne sont plus accessibles. Le résultat d'un calcul effectué dans eval peut être assigné à n'importe quelle variable accessible dans la portée actuelle. Les appels à la méthode eval sont lents. Il est donc préférable de réécrire le code qui en contient.

La désactivation du mode rapide permet de rétablir le comportement précédent de eval.

La méthode eval exécute des scripts dans un contexte de sécurité restreint

Dans les versions antérieures de JScript, le code passé à la méthode eval s'exécute dans le même contexte de sécurité que le code d'appel.

Pour protéger les utilisateurs, le code passé à la méthode eval est exécuté dans un contexte de sécurité restreint, à moins que la chaîne « unsafe » soit passée comme second paramètre. Le contexte de sécurité restreint contribue à empêcher l'accès aux ressources système, telles que le système de fichiers, le réseau ou l'interface utilisateur. Une exception de sécurité est générée si le code tente d'accéder à ces ressources.

Si le second paramètre de la méthode eval est la chaîne « unsafe », le code passé à la méthode eval est exécuté dans le même contexte de sécurité que le code appelant. Cela permet de restaurer le comportement antérieur de la méthode eval.

Note de sécurité :

Utilisez eval en mode non sécurisé seulement pour exécuter des chaînes de code obtenues à partir de sources bien connues.

Voir aussi

Concepts

Introduction à JScript 8.0 à l'intention des programmeurs JScript

Référence

/fast

Autres ressources

Mise en route de JScript