Vi el código JavaScript que comienza con with
. Eso es un poco confuso. ¿Qué hace y cómo se puede usar correctamente?¿Qué hace "con" en JavaScript?
with (sObj) return options[selectedIndex].value;
Vi el código JavaScript que comienza con with
. Eso es un poco confuso. ¿Qué hace y cómo se puede usar correctamente?¿Qué hace "con" en JavaScript?
with (sObj) return options[selectedIndex].value;
Se añade al alcance de las declaraciones contenidas en el bloque:
return sObj.options[selectedIndex].value;
puede llegar a ser:
with (sObj)
return options[selectedIndex].value;
En su caso, doens't hacer mucho. ..pero considere lo siguiente:
var a, x, y;
var r = 10;
a = Math.PI * r * r;
x = r * Math.cos(PI);
y = r * Math.sin(PI /2);
Se convierte en:
var a, x, y;
var r = 10;
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI/2);
}
... guarda un par de teclas. La documentación de Mozilla realmente hace un buen trabajo de explicar las cosas en un poco más de detalle (junto con los pros y los contras de su uso):
Yo recomendaría no usar esto a causa de problemas de rendimiento, pero lo los medios anteriores es:
para el objeto sObj (aquí presumiblemente un elemento select), todos los niños y las propiedades que se hace referencia en este (o entre seguir llaves) atienda, que como su ámbito padre.
No es una función (como se indicó en el título de la pregunta antes de ser editada) sino una declaración. Se puede tener más sentido si el ejemplo de código se formatea así:
with (sObj){
return options[selectedIndex].value;
}
En cuanto a lo que hace (Source)
La declaración establece con el objeto predeterminado para un conjunto de estados. JavaScript busca cualquier nombre no calificado dentro del conjunto de declaraciones para determinar si los nombres son propiedades del objeto predeterminado. Si un nombre no calificado coincide con una propiedad, entonces la propiedad se utiliza en la declaración; de lo contrario, se usa una variable local o global.
Lo que significa que en el ejemplo del código, primero se verifica si options
es una propiedad de sObj
. Si es entonces options
se refiere a sObj.options
, de lo contrario se comprueba otros ámbitos para una variable definida por el nombre options
La desventaja de usar una declaración with
es que es imposible saber de sólo mirar el código de lo que se accede.Hay otras alternativas mejores como se muestra en this article
Mientras que el resto de su respuesta es correcta, el formateo tiene relativamente poco que ver con eso. – belugabob
@belugabob Por favor * lea * la respuesta en lugar de adivinar en cuanto a su contenido. Nunca mencioné que el formato tenga relevancia para la declaración 'with'. Dije que tiene más * sentido * si está formateado con llaves, ya que lo hace parecer menos a una llamada de función y más como una declaración. – Yacoby
@belugabob También he reorganizado el orden de las palabras para que sea más difícil de entender mal. – Yacoby
En ese con el bloque que no tiene que escribir:
sObj.options[selectedIndex].value
pero sólo se pueden utilizar:
options[selectedIndex].value
Es el equivalente de
return sObj.options[selectedIndex].value;
With
le permite emitir un bloque de declaraciones en el conte xt de un objeto en particular. Por lo tanto, se considera que todas las afirmaciones del bloque with
son miembros del objeto entre paréntesis.
Esto puede hacer que el código sea más legible a veces, pero también puede generar ambigüedad, ya que las referencias de las variables pueden ser sObj o globales.
la declaración with
es el azúcar sintáctica pura, pero también puede causar algunos errores desagradables.
Ver with Statement Considered Harmful de aclaración:
Si no puede leer un programa y estar seguro de que sabe lo que va a hacer, no se puede tener confianza en que va a funcionar correctamente. Por esta razón, se debe evitar la declaración
with
.
++ por mencionar las desventajas de 'con' –
Tu ejemplo podría ser reescrita como ...
return sObj.options[selectedIndex].value;
... como los 'con' lugares declaración de todos los estados en el ámbito del objeto suministrado. En este caso, es bastante inútil, pero si realizaba muchas operaciones en 'sObj', ahorra mucha escritura.
ejemplo totalmente ficticio ..
with (sObj)
{
if(options[selectedIndex].value < 10){
options[selectedIndex].value++;
total+ = options[selectedIndex].value;
}
}
Pero, una vez dicho esto, es a menudo el caso de que la tipificación de ahorro se puede lograr de mejor manera.
uso de hoja de metal, al igual que en VBA. En Python con podemos encargarnos de limpiar un objeto desechable. En C# se llama usar. –
+1 - Hola Justin - Buena explicación –
@Mark - Gracias. Parece que debería haber incluido la cláusula 'sugerir no usar esto'. –