¿Cuál es el propósito de la palabra clave var y cuándo debo usarla (u omitirla)?

1543

NOTA : Esta pregunta se hizo desde el punto de vista de ECMAScript versión 3 o 5. Las respuestas podrían quedar desactualizadas con la introducción de nuevas características en el lanzamiento de ECMAScript 6.

¿Cuál es exactamente la función de la varpalabra clave en JavaScript y cuál es la diferencia entre

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

y

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

¿Cuándo usaría alguno de ellos y por qué / qué hace?

Alex
fuente
3
Al encadenar declaraciones var, ¿poner una nueva línea después de una coma afecta el comportamiento? var x = 1, y = 2, [retorno] z = 3;
Alfabravo el
44
No usar "var" también lo deja expuesto en caso de que el nombre de la variable que elija sea una variable global previamente definida. Vea mi viaje de dolor aquí: stackoverflow.com/questions/16704014/…
Scott C Wilson
55
La publicación de blog de Meloncard de @Ray Toal (definitivamente vale la pena leer) se ha trasladado a blog.safeshepherd.com/23/how-one-missing-var-ruined-our-launch
Hephaestus el
Nunca imaginé que un poema podría inspirarme a considerar un problema programático
Félix Gagnon-Grenier
1
@Gibolt, pero mira la fecha de la pregunta, es un poco injusto convocar una pregunta de 2009 para contar eso. A pesar de que todavía es válido como en la fecha actual para mantenimiento, hay un montón de código no "JS moderno".
Andre Figueiredo

Respuestas:

1356

Si estás en el ámbito global, entonces no hay mucha diferencia. Lea la respuesta de Kangax para una explicación.

Si está en una función var, creará una variable local, "no var" buscará la cadena de alcance hasta que encuentre la variable o llegue al alcance global (en ese momento la creará):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

Si no está haciendo una tarea, debe usar var:

var x; // Declare x
Greg
fuente
31
¿"Realmente no hay mucha diferencia" == "No hay diferencia"?
Alex
65
Bueno, en realidad sí, hay una diferencia :) Si esa diferencia es importante es otra cuestión. Vea mi respuesta más abajo: stackoverflow.com/questions/1470488/…
kangax
44
Creo que ese puede ser el punto de Alex, ¡por eso lo escribió con el operador "es igual a"!
James Bedford
18
Es como dispararse con un cañón de riel ... Olvídese de poner una 'var' antes de la variable y termine modificando una variable en algún lugar de la cadena de alcance ... Intente convencer a Java / C / Python / etc. desarrollador que JavaScript vale la pena. ¡Decir ah! Las dificultades de C / C ++ se ven bien por el contrario. Imagine tener que depurar JavaScript ... Y algunas personas hacen eso, por supuesto. Y hay tanto código (y no un código simple, claro) escrito en JavaScript ...
Albus Dumbledore
66
Si estás en el ámbito global, entonces no hay diferencia. >> hay una diferencia que se explica en la respuesta a continuación
Max Koretskyi
746

Hay una diferencia .

var x = 1 declara variable x en el alcance actual (también conocido como contexto de ejecución). Si la declaración aparece en una función, se declara una variable local; si está en alcance global, se declara una variable global.

x = 1, por otro lado, es simplemente una asignación de propiedad. Primero intenta resolver xcontra la cadena de alcance. Si lo encuentra en algún lugar de esa cadena de alcance, realiza la asignación; si no encuentra x, solo entonces crea una xpropiedad en un objeto global (que es un objeto de nivel superior en una cadena de alcance).

Ahora, observe que no declara una variable global, crea una propiedad global.

La diferencia entre los dos es sutil y puede ser confusa a menos que comprenda que las declaraciones de variables también crean propiedades (solo en un Objeto variable) y que cada propiedad en Javascript (bueno, ECMAScript) tiene ciertos indicadores que describen sus propiedades: ReadOnly, DontEnum y No borrar

Como la declaración variable crea una propiedad con el indicador DontDelete, la diferencia entre var x = 1yx = 1 (cuando se ejecuta en alcance global) es que la primera, la declaración variable, crea la propiedad DontDelete'able, y la segunda no. Como consecuencia, la propiedad creada a través de esta asignación implícita se puede eliminar del objeto global, y la primera, la creada mediante declaración de variable, no se puede eliminar.

Pero esto es solo teoría, por supuesto, y en la práctica hay aún más diferencias entre los dos , debido a varios errores en las implementaciones (como las de IE).

Espero que todo tenga sentido :)


[Actualización 2010/12/16]

En ES5 (ECMAScript 5; recientemente estandarizado, 5ta edición del lenguaje) hay un llamado "modo estricto" - un modo de lenguaje opcional, que cambia ligeramente el comportamiento de las tareas no declaradas. En modo estricto, la asignación a un identificador no declarado es un Error de referencia . La razón de esto fue detectar asignaciones accidentales, evitando la creación de propiedades globales no deseadas. Algunos de los navegadores más nuevos ya han comenzado a admitir el modo estricto. Ver, por ejemplo, mi tabla compat .

kangax
fuente
Si recuerdo correctamente, creo que una vez encontré una manera de poder hacer deleteuna variable declarada var con algún evaltruco. Si recuerdo el truco exacto que publicaré aquí.
Torre
3
@Mageek Él podría estar tomando sobre variables evaluadas declaradas que son eliminables. Escribí una publicación de blog sobre esto una vez.
kangax
1
Un poco fuera de tema, pero mencionándolo aquí como referencia. "let" es muy similar a "var" y es compatible con Mozilla. La principal diferencia es que el alcance de una variable var es la función de cierre completa donde "let" está restringido a su bloque
mac
@kangax, ¿qué pasaría si las dos últimas líneas de los ejemplos de Alex fueran mixtas: var someObject = {}y someObject.someProperty = 5? ¿Se somePropertyvolvería global, mientras que el objeto del que es propiedad sigue siendo local?
snapfractalpop
1
El nombre de la especificación de lo que @kangax llama el indicador DontDelete es configurable (= false) , puede leer sobre esto con respecto a Object.definePropertyyObject.getOwnPropertyDescriptor
Paul S.
137

Decir que es la diferencia entre " local y global " no es del todo exacto.

Sería mejor pensar en ello como la diferencia entre " local y más cercano ". El más cercano seguramente puede ser global, pero ese no siempre será el caso.

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}
Jonathan Lonowski
fuente
3
¿No es el ámbito más cercano outerdonde define var global = false;?
Snekse
@Snekse: 'más cercano' no se aplica cuando se declara <code> var global = false; </code>. En esa declaración, 'global' se coloca en el alcance de external () porque se usa 'var' en la declaración. Debido a que 'var' no se usa en inner (), cambiará el valor en el siguiente nivel, que es externo ().
Mitch
Me pregunto si su comentario cambiaría si cambiara esa línea, var global = local;en cuyo caso el alcance cercano de local sería el alcance externo "local" que se está definiendo activamente. Aunque se vuelve extraño si cambiara esa misma línea var global = globalen cuyo caso el alcance más cercano al buscar el valor globalestaría arriba en el alcance de la ventana global.
Snekse
80

Cuando Javascript se ejecuta en un navegador, todo su código está rodeado por una instrucción with, así:

with (window) {
    //Your code
}

Más información sobre with - MDN

Como vardeclara una variable en el alcance actual , no hay diferencia entre declarar var dentro de la ventana y no declararla en absoluto.

La diferencia viene cuando no estás directamente dentro de la ventana, por ejemplo, dentro de una función o dentro de un bloque.

Utilizando var permite ocultar variables externas que tienen el mismo nombre. De esta manera, puede simular una variable "privada", pero ese es otro tema.

Una regla general es usar siempre var , porque de lo contrario corre el riesgo de introducir errores sutiles.

EDITAR: Después de las críticas que recibí, me gustaría enfatizar lo siguiente:

  • var declara una variable en el alcance actual
  • El alcance global es window
  • No usar vardeclara implícitamentevar en el ámbito global (ventana)
  • Declarar una variable en el alcance global (ventana) usando var es lo mismo que omitirla.
  • Declarar una variable en ámbitos diferentes de la ventana usando var no es lo mismo declarar una variable sinvar
  • Siempre declare varexplícitamente porque es una buena práctica
kentaromiura
fuente
1
No te rechacé, pero el alcance es probablemente una mejor palabra que ventana. Toda su explicación es un poco obtusa.
Robert Harvey
44
Simplemente llamo a las cosas con su nombre, quieres llamarlo "alcance global", está bien, pero por convención, el lado del cliente es el objeto de ventana, ese es el último elemento de la cadena de alcance, por eso puedes llamar a cada función y cada objeto en la ventana sin escribir "ventana".
kentaromiura
2
+1 esta es una muy buena explicación: no he escuchado el problema var / no var enmarcado (sin juego de palabras) como este antes.
doug el
La mayor parte de esta respuesta está en desuso leten ES6.
Evan Carroll
3
@EvanCarroll Esta respuesta también es técnicamente incorrecta ya que la omisión de var no declara ninguna variable, sino que crea una propiedad borrable en el objeto global, además de que con ES5 el modo "usar estricto" la mayor parte de la respuesta obviamente no es correcta, también deje que wasn ' Incluso se consideró en esta respuesta, ya que en el momento de la pregunta no había ninguna referencia a la versión de JavaScript (agregada ayer), lo que implica que el estándar de referencia (en ese momento) era ECMA 262 3rd Edition.
kentaromiura
43

Utilice siempre la varpalabra clave para declarar variables. ¿Por qué? Una buena práctica de codificación debería ser una razón suficiente en sí misma, pero omitirla significa que se declara en el ámbito global (una variable como esta se denomina global "implícita"). Douglas Crockford recomienda nunca usar globales implícitos , y de acuerdo con las Pautas de codificación JavaScript de Apple :

Cualquier variable creada sin la var palabra clave se crea en el ámbito global y no se recolecta basura cuando la función regresa (porque no se sale del ámbito), presentando la oportunidad de una pérdida de memoria.

Steve Harrison
fuente
17
La "buena práctica de codificación" nunca debería ser razón suficiente en sí misma. Se trata de "algunos chicos en Internet dijeron que así es como debería verse mi código". Eso es incluso menos válido que "mi maestro dijo", a menos que uno entienda al menos vagamente la razón detrás de la regla.
cHao
@cHao Creo que good coding practicesiempre es una razón suficiente si es una práctica recomendada, que es y por varios autores de Javascript.
Chris S
8
@ChrisS: No, la "buena práctica de codificación" no es una razón en sí misma. La razón por la que se considera una buena práctica es lo que importa. A menos que esos autores le digan por qué lo recomiendan, su recomendación no debería tener ningún peso. Si no está de acuerdo con los motivos, puede considerarlo un mal consejo. Y si lo sigues sin preguntar por qué, así es como comienza el culto a la carga.
cHao
30

Aquí hay un buen ejemplo de cómo puede quedar atrapado al no declarar variables locales con var:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

( ise restablece en cada iteración del bucle, ya que no se declara localmente en el forbucle sino globalmente) lo que finalmente da como resultado un bucle infinito

Chris S
fuente
¡Ay! Solo puedo imaginar todos los errores que podrían ser causados ​​por ese error tipográfico.
BonsaiOak
2
Tengo curiosidad, ¿por qué estás pasando i como argumento a dos ()? (dentro del ciclo for) ¿es redundante?
kalin
El argumento se ignora en la función two () encapsulada en una función (), ya que la función two () se definió sin un parámetro. Tienes toda la razón, no es necesario ya que no juega un papel.
KK.
¿Error o característica?
TheMaster
13

Yo diría que es mejor usar var en la mayoría de las situaciones.

Las variables locales son siempre más rápidas que las variables de alcance global.

Si no usas var para declarar una variable, la variable estará en el ámbito global.

Para obtener más información, puede buscar "JavaScript de cadena de alcance" en Google.

Porra
fuente
Si declara una variable utilizando la palabra clave var, se creará en tiempo de ejecución, ¿no debería ser más lenta? Porque otro se crea en el momento analizado.
Barış Velioğlu
@RyuKaplan - hey, ¿es eso cierto? ¡Intenté buscar en Google y no pude obtener ninguna información sobre el tema! ¿Tiene una autoridad fuente para esa afirmación? Thx
Mike roedor
@RyuKaplan Analizar / compilar es diferente de ejecutar realmente el código.
gcampbell
11

¡No lo uses var!

varera la forma anterior a ES6 para declarar una variable. Ahora estamos en el futuro , y deberías estar codificando como tal.

Uso constylet

constdebe usarse para el 95% de los casos. Hace que la referencia variable no pueda cambiar, por lo que las propiedades de la matriz, el objeto y el nodo DOM pueden cambiar y probablemente deberían serlo const.

letdebe usarse para cualquier variable que espera ser reasignada. Esto incluye dentro de un bucle for. Si alguna vez escribe varName =más allá de la inicialización, use let.

Ambos tienen un alcance de nivel de bloque, como se esperaba en la mayoría de los otros idiomas.

Gibolt
fuente
2
Reemplace todo lo que 'var' por 'const' (reemplace todo). Notará rápidamente dónde están sus variables reasignadas. Si tiene demasiados, probablemente codifique antipatrónicamente: la mayoría de las variables reasignables se pueden incrustar en cierres o como propiedades de objeto. Si tiene algunos: use 'let' para ellos. Finalmente, si algunas variables no se retrasaron en absoluto con 'var', permanecerán sin declarar y aún están presentes en el espacio global, tenga cuidado. Sobre el comentario de @Gibolt 'dentro de un bucle for', también se recomienda evitar dichos bucles en el "95% de los casos" ;-): los métodos de matriz son excelentes.
Allez l'OM
Al decir que const debe usarse en el 95% de los casos, parece que vamos a abandonar las buenas prácticas y entrar en dogma.
Agamemnus
9

otra diferencia eg

var a = a || [] ; // works 

mientras

a = a || [] ; // a is undefined error.
Pranay Warke
fuente
1
¿Podría explicar por qué funciona en caso de variable definida con 'var' y variable no definida con var? ¿Se crea una variable antes de la evaluación del lado derecho de la asignación en caso de var?
mate
66
@Lucek porque var ase eleva a la parte superior del alcance y se establece en nulo, lo que declara pero no inicializa la variable, luego, en la asignación, tiene una referencia a una variable nula indefinida que se evalúa como falsa y establece la asignación en []. En este último, tiene una asignación a la propiedad ade la propiedad a. Puede asignar a una propiedad que no existe, creándola en la asignación, pero no puede leer de una propiedad que no existe sin que le ReferenceErrorarrojen.
Evan Carroll
1
@EvanCarroll: se eleva a la parte superior del alcance y se configura como indefinido en lugar de nulo.
mithunsatheesh
8

Usar varsiempre es una buena idea para evitar que las variables desordenen el alcance global y que las variables entren en conflicto entre sí, causando una sobrescritura no deseada.

kevinji
fuente
8

Sin var- variable global.

Se recomienda encarecidamente SIEMPRE usar la vardeclaración, porque la variable global init en el contexto local es malvada. Pero, si necesita este truco sucio, debe escribir un comentario al comienzo de la página:

/* global: varname1, varname2... */
Anatoliy
fuente
3

Este es un código de ejemplo que he escrito para que entiendas este concepto:

var foo = 5; 
bar = 2;     
fooba = 3;

// Execute an anonymous function
(function() {    
    bar = 100;             //overwrites global scope bar
    var foo = 4;           //a new foo variable is created in this' function's scope
    var fooba = 900;       //same as above
    document.write(foo);   //prints 4
    document.write(bar);   //prints 100
    document.write(fooba); //prints 900
})();

document.write('<br/>');
document.write('<br/>');
document.write(foo);       //prints 5
document.write(bar);       //prints 100
document.write(fooba);     //prints 3
nuevo día
fuente
2
La función no es en absoluto "anónima". De hecho, tiene un nombre tan visible como puede ser.
Ingo Bürk
Gracias por editar su respuesta, en respuesta al comentario de Ingo Bürk, para hacer que la "función anónima" sea realmente anónima.
Dave Burton el
3

@ Chris S dio un buen ejemplo mostrando la diferencia práctica (y el peligro) entre vary novar . Aquí hay otro, considero que este es particularmente peligroso porque la diferencia solo es visible en un entorno asincrónico, por lo que puede pasar fácilmente durante las pruebas.

Como era de esperar, las siguientes salidas de fragmentos ["text"]:

function var_fun() {
  let array = []
  array.push('text')
  return array
}

console.log(var_fun())

Lo mismo ocurre con el siguiente fragmento (tenga en cuenta lo que falta letantes array):

function var_fun() {
  array = []
  array.push('text')
  return array
}

console.log(var_fun())

Ejecutar la manipulación de datos de forma asincrónica todavía produce el mismo resultado con un solo ejecutor:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

var_fun().then(result => {console.log(result)})

Pero se comporta de manera diferente con múltiples:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

Usando let sin embargo:

function var_fun() {
  let array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

este es mi diseño
fuente
Gracias por el ejemplo @thisismydesign! Con respecto a los dos últimos ejemplos, ¿por qué el penúltimo ejemplo registra una matriz de 3 elementos con texto escrito tres veces mientras que el último ejemplo solo registra "texto" una vez por elemento dentro de la matriz? (Entiendo que el último declara "matriz" como una variable y, por lo tanto, está en el ámbito local, mientras que el penúltimo ejemplo lo omite, haciendo que "matriz" forme parte del ámbito global implícito). Pero, ¿por qué cómo esto afecta el ¿salida? ¿Es porque forEach "i" itera sobre la función y todas las variables globales?
AlmostPitt
2

Como alguien que intenta aprender esto, así es como lo veo. Los ejemplos anteriores fueron quizás un poco demasiado complicados para un principiante.

Si ejecuta este código:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

La salida se leerá como: falso, falso, verdadero, verdadero

Debido a que ve las variables en la función como separadas de las que están fuera de ella, de ahí el término variable local y esto se debió a que usamos var en la asignación. Si quitas la var en la función, ahora se lee así:

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

La salida es falsa, falsa, falsa, falsa

Esto se debe a que, en lugar de crear una nueva variable en el ámbito o función local, simplemente usa las variables globales y las reasigna a falso.

Danrex
fuente
2

Veo que la gente se confunde al declarar variables con o sin var y dentro o fuera de la función. Aquí hay un ejemplo profundo que lo guiará a través de estos pasos:

Vea el script a continuación en acción aquí en jsfiddle

a = 1;// Defined outside the function without var
var b = 1;// Defined outside the function with var
alert("Starting outside of all functions... \n \n a, b defined but c, d not defined yet: \n a:" + a + "\n b:" + b + "\n \n (If I try to show the value of the undefined c or d, console.log would throw 'Uncaught ReferenceError: c is not defined' error and script would stop running!)");

function testVar1(){
    c = 1;// Defined inside the function without var
    var d = 1;// Defined inside the function with var
    alert("Now inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};


testVar1();
alert("Run the 1. function again...");
testVar1();

function testVar2(){
    var d = 1;// Defined inside the function with var
    alert("Now inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};

testVar2();

alert("Now outside of all functions... \n \n Final Values: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n You will not be able to see d here because then the value is requested, console.log would throw error 'Uncaught ReferenceError: d is not defined' and script would stop. \n ");
alert("**************\n Conclusion \n ************** \n \n 1. No matter declared with or without var (like a, b) if they get their value outside the function, they will preserve their value and also any other values that are added inside various functions through the script are preserved.\n 2. If the variable is declared without var inside a function (like c), it will act like the previous rule, it will preserve its value across all functions from now on. Either it got its first value in function testVar1() it still preserves the value and get additional value in function testVar2() \n 3. If the variable is declared with var inside a function only (like d in testVar1 or testVar2) it will will be undefined whenever the function ends. So it will be temporary variable in a function.");
alert("Now check console.log for the error when value d is requested next:");
alert(d);

Conclusión

  1. No importa si se declara con o sin var (como a, b) si obtienen su valor fuera de la función, conservarán su valor y también se conservarán los demás valores que se agreguen dentro de varias funciones a través del script.
  2. Si la variable se declara sin var dentro de una función (como c), actuará como la regla anterior, conservará su valor en todas las funciones de ahora en adelante. O obtuvo su primer valor en la función testVar1 () aún conserva el valor y obtiene un valor adicional en la función testVar2 ()
  3. Si la variable se declara con var solo dentro de una función (como d en testVar1 o testVar2), será indefinida cada vez que finalice la función. Por lo tanto, será una variable temporal en una función.
Tarik
fuente
Gracias por tomarse el tiempo para crear un ejemplo para demostrar este tema. Al código anterior le falta la parte a continuación, por lo que es posible que desee editar su respuesta: a = 1; // Definido fuera de la función sin var var b = 1; // Definido fuera de la función con alerta var ("Comenzando fuera de todas las funciones ... \ n \ na, b definido pero c, d aún no definido: \ na: "+ a +" \ nb: "+ b +" \ n \ n (Si intento mostrar el valor de la c indefinida od, console.log arrojaría 'Error de referencia no capturado: c no está definido' ¡error y el script dejaría de ejecutarse!) ");
Sankofa
1

Dentro de un código, si usa una variable sin usar var, entonces lo que sucede es que var var_name se coloca automáticamente en el ámbito global, por ejemplo:

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}
Akash Arora
fuente
1

Además del problema de los alcances, algunas personas también mencionan el izado , pero nadie dio un ejemplo. Aquí hay uno para el alcance global:

console.log(noErrorCase);
var noErrorCase = "you will reach that point";

console.log(runTimeError);
runTimeError = "you won't reach that point";

deathangel908
fuente
0

Sin usar "var", las variables solo pueden definirse cuando se establece un valor. Por ejemplo:

my_var;

no puede funcionar en alcance global ni en ningún otro alcance . Debe tener un valor como:

my_var = "value";

Por otro lado, puede definir un valor variable;

var my_var;

Su valor es undefined(Su valor no es nully no es igual a nullinteresante).

umut
fuente
my_var;es en realidad una declaración de expresión válida.
lexicore
Es una declaración válida si la variable se define antes. De lo contrario, arroja un error "... no está definido".
umut
3
Es una declaración válida independientemente de si una variable se definió antes o no. :) Una declaración válida puede arrojar un error, no invalida la declaración .
lexicore
Estoy confundido al respecto. ¿Qué es una declaración válida? ¿Y me puede dar un ejemplo de declaración no válida?
umut
Tendré que disculparme, demasiada gramática ECMAScript últimamente. my_var;Es una declaración de expresión válida . /my_var;Sería una declaración inválida. Pero como dije, esto es casuística gramatical, me disculpo, mi comentario en realidad no era apropiado.
lexicore
0

Debe usar la palabra clave var a menos que tenga la intención de tener la variable asociada al objeto de ventana en el navegador. Aquí hay un enlace que explica el alcance y la diferencia entre el alcance global y el alcance local con y sin la palabra clave var.

Cuando las variables se definen sin el uso de la palabra clave var, lo que parece es una simple operación de "asignación".

Cuando el valor se asigna a una variable en javascript, el intérprete primero intenta encontrar la "declaración de variable" en el mismo contexto / alcance que el de la asignación. Cuando el intérprete se ejecuta dummyVariable = 20, busca la declaración de dummyVariable al comienzo de la función. (Dado que todas las declaraciones de variables se mueven al comienzo del contexto por el intérprete de JavaScript y esto se denomina elevación)

También es posible que desee ver la elevación en javascript

Simran kaur
fuente