Visit Mozilla.org

Référence de JavaScript 1.5 Core:Instructions:with

Un article de MDC.


Sommaire

[modifier] Résumé

Agrandit la chaîne de visibilité pour une instruction.

Instruction
Implémentation : JavaScript 1.0, NES 2.0
Version ECMA : ECMA-262

[modifier] Syntaxe

with (objet)
  instruction

[modifier] Paramètres

objet 
Ajoute l'objet donné à la chaîne de visibilité utilisée lors de l'évaluation de l'instruction. Les parenthèses autour du nom de l'objet sont obligatoires.
instruction 
N'importe quelle instruction. Pour exécuter plusieurs instructions avec with, utilisez un bloc ({ … }) pour les regrouper.

[modifier] Description

JavaScript recherche un nom non qualifié (sans préfixe) dans une chaîne de visibilité associée avec le contexte d'exécution du script ou de la fonction contenant ce nom. L'instruction with ajoute un objet donné en tête de cette chaîne pour l'évaluation de l'instruction qu'elle contient. Si un nom non qualifié est utilisé dans cette instruction et correspond à une propriété dans la chaîne de visibilité, il correspondra à la propriété de l'objet qui la contient. S'il n'est pas trouvé, une exception « ReferenceError » est déclenchée.

Note : Firefox 1.5 générait un avertissement lorsque l'instruction with était utilisée : "deprecated with statement usage". Cet avertissement a été enlevé de Firefox 1.5.0.1 (bug 322430).

Avantages et inconvénients pour les performances

  • Avantages : with peut aider à réduire la taille du fichier en réduisant le nombre de répétitions de longues références à un objet sans réduire les performances. La modification de visibilité qu'entraine with n'est pas coûteuse en termes de calcul. Son utilisation allègera le travail de l'interpréteur en le dispensant d'analyser des références d'objet répétées. Notez cependant que dans de nombreux cas, ce même avantage peut être obtenu en utilisant une variable temporaire pour conserver la référence à l'objet désiré.
  • Inconvénients : with oblige l'objet spécifié à être vérifié en premier lieu pour toute recherche de nom non qualifié. Par conséquent, tous les identifiants correspondant à des paramètres formels de la fonction ou des variables déclarées seront trouvés moins rapidement au sein d'un bloc with. Là où les performances ont de l'importance, with ne sera probablement utilisé que pour des blocs de code qui n'utilisent pas de paramètres de fonctions ni d'identifiants de variables déclarées.

Ambigüité

  • Inconvénient : with rend difficile la lecture par un humain ou par le compilateur JavaScript afin de déterminer si un nom non qualifié sera trouvé dans la chaîne de visibilité, et si oui, dans quel objet. Si l'on prend cette fonction par exemple :
    function f(x, o) {
      with (o)
        print(x);
    }
    

    C'est seulement au moment de l'appel de f qu'x est trouvé ou non, et si c'est le cas, ce sera soit dans o ou (si cette propriété n'existe pas) dans l'objet d'activation de f, où x indique le premier paramètre formel. Si vous oubliez de définir x dans l'objet que vous passez en second paramètre, ou s'il y a un autre problème ou confusion du même type, vous n'aurez aucune erreur — simplement des résultats inattendus.

[modifier] Exemples

[modifier] Exemple : utilisation de with

L'instruction with suivante indique que l'objet Math est l'objet par défaut. Les instructions contenues dans l'instruction with font référence à la propriété PI et aux méthodes cos et sin, sans spécifier d'objet. JavaScript utilise automatiquement l'objet Math pour ces références.

var a, x, y;
var r = 10;
with (Math) {
  a = PI * r * r;
  x = r * cos(PI);
  y = r * sin(PI / 2);
}