javascript - script - ¿Cuál es la diferencia entre una instrucción de bloqueo y un equivalente con una declaración?
title html attribute (3)
Aquí están las diferentes reglas de alcance para cada declaración.
con:
La instrucción with hace que el acceso a las referencias nombradas sea ineficaz, porque los ámbitos para dicho acceso no se pueden calcular hasta el tiempo de ejecución
dejar:
El alcance de las variables definidas utilizando let es el bloque let, así como cualquier bloque interno contenido dentro de él, a menos que esos bloques definan variables con los mismos nombres.
La instrucción let
no es estándar, mientras que la instrucción with
no está disponible en el modo estricto.
Referencias
OBSOLETO
La versión de bloque de la instrucción let se eliminó de ES6 antes de que se finalizara, y se eliminó de los navegadores que la admitían. Esta pregunta es ahora de interés histórico.
¿Hay alguna diferencia entre usar una instrucción de bloqueo de ECMAScript 6 y usar una instrucción with con un objeto equivalente literal?
usando let
declaración
var x = 10;
let (x = x * 10,
y = x + 5) {
console.log("x is " + x + ", y is " + y);
}
utilizando with
declaración
var x = 10;
with ({x: x * 10,
y: x + 5}) {
console.log("x is " + x + ", y is " + y);
// writes "x is 100, y is 15"
}
Lo mejor que se me ocurre es que también filtrará cualquier propiedad del prototipo Object
:
with ({x: 10}) {
hasOwnProperty = 3;
console.log(hasOwnProperty); // 3
}
console.log(hasOwnProperty); // [native code]; this is window.hasOwnProperty
Es poco probable que sea un problema en la práctica, pero sigue siendo un problema potencial.
También sospecho que with
es un poco más lento que los léxicos, ya que agrega otro espacio de nombres que debe buscarse.
Honestamente, simplemente evitaría ambas construcciones; with
acceso implícito a la propiedad with
estilo no me sienta bien, y si realmente necesito un alcance tan estrecho como ese, un bloque desnudo con expresiones en el interior de lectura se lee con menos torpeza que un bloque en espera.
Puedes usar ambas afirmaciones with
y let
para lograr el mismo objetivo, pero veo dos diferencias significativas aquí. Al final, la sentencia let
es una nueva revisión de la sentencia with con las desventajas de esta última eliminada.
Rendimiento : en el caso de la declaración with
, se agrega un objeto JavaScript adicional a la cadena de alcance. Esto no es un costo pequeño, hay que recordar que los objetos tienen una cadena de prototipos potencialmente larga y, por lo tanto, para buscar una variable, el motor de JavaScript primero tiene que buscar el objeto y todos sus prototipos. Por otro lado, para una sentencia let
, el motor solo necesita buscar a lo sumo un objeto adicional. La declaración let
puede implementarse sin ningún tipo de sobrecarga, ya que todas las variables declaradas en una declaración let
son conocidas en el momento de la compilación y el motor de JavaScript puede optimizar fácilmente el código, por ejemplo, tratando esencialmente su ejemplo como:
var x = 10;
var let1x = x * 10;
var let1y = x + 5;
{
console.log("x is " + let1x + ", y is " + let1y);
}
Legibilidad del código : como ya se mencionó anteriormente, una declaración de let
siempre hace visibles todas las declaraciones en el momento de la compilación, esto evita el código como este:
with (foo)
{
console.log("x is " + x + ", y is " + y);
}
Si miras el código anterior, ¿qué es x
y qué es y
? ¿Son variables de función o propiedades del objeto foo
? No puede decirlo sin saber qué es foo
, y puede ser diferente para diferentes llamadas de la misma función. ¿Cuál es la razón principal por la que la sentencia with
ha sido desaprobada? Si bien puede usarlo de la manera que lo hizo en su pregunta (y eso está bien), también permite construcciones de código muy cuestionables e ilegibles. La declaración de let
no, la menor flexibilidad es a veces una ventaja.