2010-03-29 16 views

Respuesta

22

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):

with - Mozilla Developer Center

+0

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. –

+0

+1 - Hola Justin - Buena explicación –

+0

@Mark - Gracias. Parece que debería haber incluido la cláusula 'sugerir no usar esto'. –

1

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.

1

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

+0

Mientras que el resto de su respuesta es correcta, el formateo tiene relativamente poco que ver con eso. – belugabob

+0

@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

+0

@belugabob También he reorganizado el orden de las palabras para que sea más difícil de entender mal. – Yacoby

2

En ese con el bloque que no tiene que escribir:

sObj.options[selectedIndex].value 

pero sólo se pueden utilizar:

options[selectedIndex].value 
2

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.

legitimate uses for javascript's "with" statement: D

9

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.

+2

++ por mencionar las desventajas de 'con' –

1

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.