aboutsummaryrefslogtreecommitdiff
path: root/files/es/web/javascript/referencia/sentencias/let/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'files/es/web/javascript/referencia/sentencias/let/index.html')
-rw-r--r--files/es/web/javascript/referencia/sentencias/let/index.html393
1 files changed, 0 insertions, 393 deletions
diff --git a/files/es/web/javascript/referencia/sentencias/let/index.html b/files/es/web/javascript/referencia/sentencias/let/index.html
deleted file mode 100644
index 8c450b37d4..0000000000
--- a/files/es/web/javascript/referencia/sentencias/let/index.html
+++ /dev/null
@@ -1,393 +0,0 @@
----
-title: let
-slug: Web/JavaScript/Referencia/Sentencias/let
-tags:
- - Característica del lenguaje
- - Declaración de variable
- - ECMAScript 2015
- - JavaScript
- - Variables
- - let
- - sentencias
-translation_of: Web/JavaScript/Reference/Statements/let
----
-<div>{{jsSidebar("Statements")}}</div>
-
-<p>La instrucción <strong><code>let</code></strong> declara una variable de alcance local con ámbito de bloque<font><font>(</font></font><a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/block">block </a>scope<font><font>)</font></font>, la cual, opcionalmente, puede ser inicializada con algún valor.</p>
-
-<div class="warning">
-<p class="p1">La palabra reservada <strong><code><span class="s1">let </span></code></strong>en Mozilla Firefox 44 y anteriores, está solo disponible para bloques de código en HTML que esten envueltos en una etiqueta <code><span class="s1">&lt;script type="application/javascript;version=1.7"&gt;</span></code> (o de una version mayor). Las etiquetas <a href="https://developer.mozilla.org/en-US/docs/XUL">XUL</a> tienen acceso a esas características sin necesidad de dicho bloque.  Es necesario tomar en cuenta que esta es una característica <s>no estándar</s> <u>que ya se ha hecho actualmente estándar</u>, <s>esto</s> <u>pero</u> puede crear conflictos con otros navegadores<u>, ya que fue una característica no estándar.</u></p>
-</div>
-
-<h2 id="Sintaxis">Sintaxis</h2>
-
-<pre class="syntaxbox notranslate">let var1 [= valor1] [, var2 [= valor2]] [, ..., varN [= valorN]];</pre>
-
-<h3 id="Parámetros">Parámetros</h3>
-
-<dl>
- <dt><code>var1</code>, <code>var2</code>, …, <code>varN</code></dt>
- <dd>Los nombres de la variable o las variables a declarar. Cada una de ellas debe ser un identificador legal de JavaScript</dd>
- <dt><code>value1</code>, <code>value2</code>, …, <code>valueN</code></dt>
- <dd>Por cada una de las variables declaradas puedes, opcionalmente, especificar su valor inicial como una expresión legal JavaScript.</dd>
-</dl>
-
-<h2 id="Descripción">Descripción</h2>
-
-<p><strong><code>let</code> </strong>te permite declarar variables limitando su alcance (<em>scope</em>) al bloque, declaración, o expresión donde se está usando.a diferencia de la palabra clave <code>var</code> la cual define una variable global o local en una función sin importar el ámbito del bloque. La otra diferencia entre <code>var</code> y <code>let</code> <span class="VIiyi" lang="es"><span class="ChMk0b JLqJ4b"><span>es que este último se inicializa a un valor sólo cuando un analizador lo evalúa (ver abajo).</span></span></span></p>
-
-<p>Al igual que <code>const</code>, <code>let </code>no crea propiedades del objeto se declara globalmente (en el alcance más alto).</p>
-
-<h3 id="Alcance_scope_a_nivel_de_bloque_con_let">Alcance (<em>scope</em>) a nivel de bloque con <code>let</code></h3>
-
-<p>Usar la palabra reservada <code>let</code> para definir variables dentro de un bloque.</p>
-
-<pre class="brush:js notranslate">if (x &gt; y) {
- let gamma = 12.7 + y;
- i = gamma * x;
-}
-</pre>
-
-<p>Es posible usar definiciones <code>let</code> para asociar código en extensiones con un pseudo-espacio-de-nombre (pseudo-namespace). (Ver <a href="/en-US/docs/Security_best_practices_in_extensions" title="en-US/docs/Security_best_practices_in_extensions">Mejores prácticas de seguridad en extensiones</a>.)</p>
-
-<pre class="brush:js notranslate">let Cc = Components.classes, Ci = Components.interfaces;
-</pre>
-
-<p><code>let</code> puede ser útil para escribir código más limpio cuando usamos funciones internas.</p>
-
-<pre class="brush:js notranslate">var list = document.getElementById("list");
-
-for (var i = 1; i &lt;= 5; i++) {
- var item = document.createElement("LI");
- item.appendChild(document.createTextNode("Item " + i));
-
-  let j = i;
- item.onclick = function (ev) {
- console.log("Item " + j + " is clicked.");
- };
- list.appendChild(item);
-}
-</pre>
-
-<p>El ejemplo anterior trabaja como se espera porque las cinco instancias de la función (anónima) interna hacen referencia a cinco diferentes instancias de la variable <code>j</code>. Nótese que esto no funcionaría como se espera si reemplazamos <code>let</code> con <code>var</code> o si removemos la variable <code>j</code> y simplemente usamos la variable <code>i</code> dentro de la función interna.</p>
-
-<h4 id="Reglas_de_alcance">Reglas de alcance</h4>
-
-<p>Variables declaradas por <code>let</code> tienen por alcance el bloque en el que se han definido, así mismo, como en cualquier bloque interno. De esta manera, <code>let</code> trabaja muy parecido a <code>var</code>. La más notable diferencia es que el alcance de una variable <code>var</code> es la función contenedora:</p>
-
-<pre class="brush:js notranslate">function varTest() {
- var x = 31;
- if (true) {
- var x = 71; // ¡misma variable!
- console.log(x); // 71
- }
- console.log(x); // 71
-}
-
-function letTest() {
- let x = 31;
- if (true) {
- let x = 71; // variable diferente
- console.log(x); // 71
- }
- console.log(x); // 31
-}
-// llamamos a las funciones
-varTest();
-letTest();
-</pre>
-
-<p>En el nivel superior de un programa y funciones, <code>let</code> , a diferencia de <code>var</code>, <strong>no crea</strong> una propiedad en el objeto global, por ejemplo:</p>
-
-<pre class="brush:js notranslate">var x = 'global';
-let y = 'global';
-console.log(this.x); // "global"
-console.log(this.y); // undefined
-</pre>
-
-<p>La salida de este código desplegaría "global" una vez.</p>
-
-<h3 id="Zona_muerta_temporal_y_errores_con_let">Zona muerta temporal y errores con <code>let<a id="muerta" name="muerta"></a></code></h3>
-
-<p>La <strong>redeclaración</strong> de la misma variable bajo un mismo <font><font><a href="https://www.ecma-international.org/ecma-262/6.0/#sec-lexical-environments">ámbito léxico</a> </font></font>terminaría en un error de tipo <code><a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/SyntaxError" title="SyntaxError">SyntaxError</a></code>. Esto también es <strong>extensible</strong> si usamos <code>var</code> dentro del <font><font>ámbito léxico</font></font>. Esto nos salvaguarda de redeclarar una variable accidentalmente y que no era posible  solo con <code>var.</code></p>
-
-<pre class="brush: js notranslate">if (x) {
- let foo;
- let foo; // Terminamos con un SyntaxError.
-}
-if (x) {
-  let foo;
-  var foo; // Terminamos con un SyntaxError.
-}
-</pre>
-
-<p>En ECMAScript 2015, <code>let</code> <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/var#Description">no eleva</a> la variable a la parte superior del bloque. Si se hace una referencia a la variable declarada con <code>let</code> (<code>let foo</code>) antes de su declaración, terminaríamos con un error de tipo <code><a href="/en-US/docs/JavaScript/Reference/Global_Objects/ReferenceError" title="TypeError">ReferenceError</a> </code>(al contrario de la variable declarada con <code>var</code>, que tendrá el valor <code>undefined</code>), esto porque la variables vive en una "zona muerta temporal" desde el inicio del bloque hasta que la declaración ha sido procesada.</p>
-
-<pre class="notranslate"><code>function do_something() {
- console.log(bar); // undefined
- console.log(foo); // ReferenceError: foo </code>no está definido<code>
- var bar = 1;
- let foo = 2;
-}</code></pre>
-
-<p>Es posible encontrar errores en bloques de control <a href="/en-US/docs/JavaScript/Reference/Statements/switch" title="switch"><code>switch</code></a> debido a que solamente existe un block subyacente.</p>
-
-<pre class="brush: js notranslate">switch (x) {
- case 0:
- let foo;
- break;
-
- case 1:
- let foo; // Terminamos con un error de tipo SyntaxError.
-  // esto debido a la redeclaracion
- break;
-}</pre>
-
-<h3 id="Otro_ejemplo_de_zona_muerta_temporal_combinada_con_ámbito_léxico"><font><font>Otro ejemplo de zona muerta temporal combinada con <a href="https://www.ecma-international.org/ecma-262/6.0/#sec-lexical-environments">ámbito léxico</a></font></font></h3>
-
-<p>Debido al alcance léxico, el identificador <code>num</code> dentro de la expresión (<code>num + 55</code>) se evalúa como <code>num</code> del bloque <code>if</code>, y no como la variable <code>num</code> con el valor 33 que esta por encima</p>
-
-<p>En esa misma línea, el <code>num </code>del bloque <code>if</code> ya se ha creado en el ámbito léxico, pero aún no ha alcanzado (y <strong>terminado</strong>) su inicialización (que es parte de la propia declaración): todavía está en la zona muerta temporal.</p>
-
-<pre class="notranslate"><code>function prueba(){
- var num = 33;
- if (true) {
- let num = (num + 55);</code>//ReferenceError: no se puede acceder a la declaración léxica `num'antes de la inicialización <code>
- }
-}
-prueba();</code>
-</pre>
-
-<h2 id="Ejemplos">Ejemplos</h2>
-
-<h3 id="let_vs_var"><code>let</code> vs <code>var</code></h3>
-
-<p>Cuando usamos <code>let</code> dentro de un bloque, podemos limitar el alcance de la variable a dicho bloque. Notemos la diferencia con <code>var</code>, cuyo alcance reside dentro de la función donde ha sido declarada la variable.</p>
-
-<pre class="brush: js notranslate">var a = 5;
-var b = 10;
-
-if (a === 5) {
- let a = 4; // El alcance es dentro del bloque if
- var b = 1; // El alcance es global
-
- console.log(a); // 4
- console.log(b); // 1
-}
-
-console.log(a); // 5
-console.log(b); // 1</pre>
-
-<h3 id="let_en_bucles"><code>let</code> en bucles</h3>
-
-<p>Es posible usar la palabra reservada <code>let</code> para enlazar variables con alcance local dentro del alcance de un bucle en lugar de usar una variable global (definida usando <code>var</code>) para dicho propósito.</p>
-
-<pre class="brush: js notranslate">for (let i = 0; i&lt;10; i++) {
- console.log(i); // 0, 1, 2, 3, 4 ... 9
-}
-
-console.log(i); // ReferenceError: i is not defined
-</pre>
-
-<h2 id="Extensiones_let_no-estandar">Extensiones <code>let</code> no-estandar</h2>
-
-<h3 id="Bloques_let">Bloques<code> let</code></h3>
-
-<div class="warning">
-<p>La <strong>sintaxis del bloque y expresion</strong> <code>let</code> es no-estandar y sera deshechado en un futuro. ¡No deben ser usados! ver <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1023609" rel="noopener" title="FIXED: Remove SpiderMonkey support for let expressions">error 1023609</a> y <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1167029" rel="noopener" title="FIXED: Remove SpiderMonkey support for let blocks">error 1167029</a> para mas detalles.</p>
-</div>
-
-<p>Un <strong>bloque <code>let</code></strong> provee una manera de asociar valores con variables dentro del alcance de un bloque sin afectar el valor de variables con nombre similar fuera del bloque.</p>
-
-<h4 id="Sintaxis_2">Sintaxis</h4>
-
-<pre class="syntaxbox notranslate">let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) {declaración};</pre>
-
-<h4 id="Descripción_2">Descripción</h4>
-
-<p>El bloque <code>let</code> provee alcance local para las variables. Funciona enlazando cero o más variables en el alcance léxico de un solo bloque de código; de otra manera, es exactamente lo mismo que una declaración de bloque. Hay que notar particularmente que el alcance de una variable declarada dentro de un bloque <code>let</code> usando var es equivalente a declarar esa variable fuera del bloque <code>let</code>; dicha variable aún tiene alcance dentro de la función. Al usar la sintaxis de bloque <code>let</code>, los paréntesis siguientes a <code>let</code> son requeridos. Una falla al incluir dichos paréntesis resultará en un error de sintaxis.</p>
-
-<h4 id="Ejemplo">Ejemplo</h4>
-
-<pre class="brush:js notranslate">var x = 5;
-var y = 0;
-
-let (x = x+10, y = 12) {
- console.log(x+y); // 27
-}
-
-console.log(x + y); // 5
-</pre>
-
-<p>Las reglas para el bloque de código son las mismas que para cualquier otro bloque de código en JavaScript. Es posible tener sus propias variables locales usando declaraciones <code>let</code> en dicho bloque.</p>
-
-<h4 id="Reglas_de_alcance_2">Reglas de alcance</h4>
-
-<p>El alcance de las variables definidas usando <code>let</code> es el mismo bloque <code>let</code>, así como cualquier bloque interno contenido dentro de el bloque, a menos que esos bloques internos definan variables con el mismo nombre.</p>
-
-<h3 id="expresiones_let">expresiones <code>let</code></h3>
-
-<div class="warning">
-<p><code>Soporte de <strong>expresiones</strong> let</code> ha sido removido en Gecko 41 ({{bug(1023609)}}).</p>
-</div>
-
-<p>Una <strong>expresion <code>let</code></strong> permite establecer variables con alcance dentro de una expresión.</p>
-
-<h4 id="Sintaxis_3">Sintaxis</h4>
-
-<pre class="syntaxbox notranslate">let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) expression;</pre>
-
-<h4 id="Ejemplo_2">Ejemplo</h4>
-
-<p>Podemos usar <code>let</code> para establecer variables que tienen como alcance solo una expresión:</p>
-
-<pre class="brush: js notranslate">var a = 5;
-let(a = 6) console.log(a); // 6
-console.log(a); // 5</pre>
-
-<h4 id="Reglas_de_alcance_3">Reglas de alcance</h4>
-
-<p>Dada la expresión <code>let</code> siguiente:</p>
-
-<pre class="eval notranslate">let (<var>decls</var>) <var>expr</var>
-</pre>
-
-<p>Existe un bloque implícito creado alrededor de expr.</p>
-
-<h2 id="Especificaciones">Especificaciones</h2>
-
-<table class="standard-table">
- <tbody>
- <tr>
- <th scope="col">Especificación</th>
- <th scope="col">Estado</th>
- <th scope="col">Comentarios</th>
- </tr>
- <tr>
- <td>{{SpecName('ES2015', '#sec-let-and-const-declarations', 'Let and Const Declarations')}}</td>
- <td>{{Spec2('ES2015')}}</td>
- <td>Definición initial. No especifica expresiones ni declaraciones let.</td>
- </tr>
- </tbody>
-</table>
-
-<h2 id="Compatibilidad_en_navegadores">Compatibilidad en navegadores</h2>
-
-<h2 id="CompatibilityTable"><span style="font-size: 14px; font-weight: normal; line-height: 1.5;">{{CompatibilityTable}}</span></h2>
-
-<div id="compat-desktop">
-<table class="compat-table">
- <tbody>
- <tr>
- <th>Característica</th>
- <th>Chrome</th>
- <th>Firefox (Gecko)</th>
- <th>Internet Explorer</th>
- <th>Opera</th>
- <th>Safari</th>
- </tr>
- <tr>
- <td>Soporte básico</td>
- <td>
- <p class="p1">{{CompatChrome(41.0)}}</p>
- </td>
- <td>{{ CompatGeckoDesktop("1.8.1") }} [1]</td>
- <td>11</td>
- <td>17</td>
- <td>{{CompatUnknown}}</td>
- </tr>
- <tr>
- <td>Zona muerta temporal</td>
- <td>{{CompatUnknown}}</td>
- <td>{{ CompatGeckoDesktop("35") }} [1]</td>
- <td>{{CompatUnknown}}</td>
- <td>{{CompatUnknown}}</td>
- <td>{{CompatUnknown}}</td>
- </tr>
- <tr>
- <td>Expresión<code> let</code> {{non-standard_inline}}</td>
- <td>{{CompatNo}}</td>
- <td>{{ CompatGeckoDesktop("1.8.1") }}-{{ CompatGeckoDesktop("40") }} [1]</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- </tr>
- <tr>
- <td>Bloque<code> let</code> {{non-standard_inline}}</td>
- <td>{{CompatNo}}</td>
- <td>{{ CompatGeckoDesktop("1.8.1") }} [1]</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- </tr>
- </tbody>
-</table>
-</div>
-
-<div id="compat-mobile">
-<table class="compat-table">
- <tbody>
- <tr>
- <th>Característica</th>
- <th>Android</th>
- <th>Chrome para Android</th>
- <th>Firefox Mobile (Gecko)</th>
- <th>IE Mobile</th>
- <th>Opera Mobile</th>
- <th>Safari Mobile</th>
- </tr>
- <tr>
- <td>Soporte básico</td>
- <td>{{CompatUnknown}}</td>
- <td>
- <p class="p1">{{CompatChrome(41.0)}}</p>
- </td>
- <td>{{ CompatGeckoMobile("1.8.1") }} [1]</td>
- <td>{{CompatUnknown}}</td>
- <td>{{CompatUnknown}}</td>
- <td>{{CompatUnknown}}</td>
- </tr>
- <tr>
- <td>Zona muerta temporal</td>
- <td>{{CompatUnknown}}</td>
- <td>{{CompatUnknown}}</td>
- <td>{{ CompatGeckoMobile("35") }} [1]</td>
- <td>{{CompatUnknown}}</td>
- <td>{{CompatUnknown}}</td>
- <td>{{CompatUnknown}}</td>
- </tr>
- <tr>
- <td>Expresión<code> let</code> {{non-standard_inline}}</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- <td>{{ CompatGeckoMobile("1.8.1") }}-{{ CompatGeckoMobile("40") }}[1]</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- </tr>
- <tr>
- <td>Bloque<code> let</code> {{non-standard_inline}}</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- <td>{{ CompatGeckoMobile("1.8.1") }} [1]</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- <td>{{CompatNo}}</td>
- </tr>
- </tbody>
-</table>
-</div>
-
-<h3 id="Notas_específicas_a_Firefox">Notas específicas a Firefox</h3>
-
-<ul>
- <li>[1]: Solo disponible para bloques de codigo HTML dentro de una etiqueta <code>&lt;script&gt; type="application/javascript;version=1.7"&gt;</code> (o de una versión mayor). Es necesario tomar en cuenta que esta es una característica no estándar, esto puede crear conflictos con otros navegadores. Las etiquetas <a href="https://developer.mozilla.org/en-US/docs/XUL">XUL</a> tienen acceso a esas características sin necesidad de dicho bloque. Ver<span style="line-height: 1.5;">{{bug(932513)}}.</span></li>
- <li>Conformidad con ES2015 para <code>let</code> en SpIderMonkey es monitoreado en {{bug(950547)}} y extensiones no-standar seran eliminadas en el futuro {{bug(1023609)}}.</li>
-</ul>
-
-<h2 id="Ver_también">Ver también</h2>
-
-<ul>
- <li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/var"><code>var</code></a></li>
- <li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/const"><code>const</code></a></li>
-</ul>