Question

J'ai vu du code JavaScript qui commence par with. C'est un peu déroutant. Que fait-il et comment peut-il être utilisé correctement?

with (sObj) return options[selectedIndex].value;
Était-ce utile?

La solution

Il ajoute à la portée des déclarations contenues dans le bloc:

return sObj.options[selectedIndex].value;

peut devenir:

with (sObj)
    return options[selectedIndex].value;

Dans votre cas, il doens't faire beaucoup ... mais considérer ce qui suit:

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

Devient:

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

... enregistre quelques frappes. La documentation Mozilla ne fait un très bon travail d'expliquer les choses un peu plus en détail (avec les avantages et les inconvénients de l'utiliser):

avec - Mozilla Developer Centre

Autres conseils

la déclaration de with est pur sucre syntactique, mais il peut aussi causer quelques bugs désagréables.

Voir avec Déclaration Considered Harmful des éclaircissements :

  

Si vous ne pouvez pas lire un programme et être sûr que vous savez ce qu'il va faire, vous ne pouvez pas avoir confiance qu'il va fonctionner correctement. Pour cette raison, la déclaration de with doit être évitée.

Dans ce bloc avec vous ne devez taper:

sObj.options[selectedIndex].value

mais vous pouvez simplement utiliser:

options[selectedIndex].value

Son équivalent de

return sObj.options[selectedIndex].value;

With vous permet d'émettre un bloc de déclarations dans le contexte d'un objet particulier. Par conséquent, toutes les déclarations contenues dans le bloc with sont considérées comme membres de l'objet entre parenthèses.

Cela peut rendre le code plus lisible parfois, mais elle peut aussi conduire à l'ambiguïté, car les références variables peuvent être soit avec SOBJ ou mondial.

utilisations légitimes de javascript de "avec" déclaration : D

Je recommande pas d'utiliser cela à cause de problèmes de performances, mais ce que les moyens ci-dessus est:

pour l'objet SOBJ (ici probablement un élément de sélection), tous les enfants et les propriétés mentionnées sur celui-ci (ou entre accolades suivant) traiter que leur champ d'application parent.

Votre exemple pourrait être réécrite comme ...

return sObj.options[selectedIndex].value;

... les « avec » les lieux de déclaration toutes les déclarations connexes dans le cadre de l'objet fourni. Dans ce cas, il est assez inutile, mais, si vous faisiez beaucoup d'opérations sur « SOBJ », il permet d'économiser beaucoup de frappe.

Exemple totalement ficticious ..

with (sObj) 
{
   if(options[selectedIndex].value < 10){
       options[selectedIndex].value++;
       total+ = options[selectedIndex].value;
   }
}

Mais, cela étant dit, il est souvent le cas qui frappe d'économie peut être réalisé de meilleures façons.

Il est pas une fonction (comme cela a été indiqué dans le titre de la question avant modification), mais une déclaration. Il peut faire plus de sens que si l'exemple de code est formaté comme ceci:

with (sObj){
    return options[selectedIndex].value;
}

En ce qui concerne ce qu'il fait ( Source )

  

La déclaration établit avec l'objet par défaut pour un ensemble d'instructions. JavaScript regarde les noms non qualifiés dans l'ensemble des déclarations afin de déterminer si les noms sont des propriétés de l'objet par défaut. Si un nom non qualifié correspond à une propriété, la propriété est utilisée dans l'instruction; sinon, une variable locale ou globale est utilisée.

Ce qui signifie que dans l'exemple de code, il est d'abord vérifié si options est une propriété de sObj. Si elle est alors options fait référence à sObj.options, sinon il vérifie d'autres champs d'application d'une variable définie par le nom options

L'inconvénient d'utiliser une déclaration de with est qu'il est impossible de savoir à partir juste en regardant le code ce qui sera accessible. Il existe d'autres meilleures alternatives comme le montre cet article

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top