w3schools script attribute javascript language-features with-statement let ecmascript-6

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.