variable - this this javascript




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

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

¿Cuál es exactamente la función de la palabra clave var 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ías uno de ellos y por qué / qué hace?


¡No uses var !

var era la forma pre-ES6 de declarar una variable. Ahora estamos en el futuro , y usted debería estar codificando como tal.

Usa const y let

const debe utilizarse para el 95% de los casos. Esto hace que la referencia de la variable no pueda cambiar, por lo que las propiedades de la matriz, el objeto y el nodo DOM pueden cambiar y probablemente deberían ser const .

let debe ser utilizado 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 espera en la mayoría de los otros idiomas.


@Chris S dio un buen ejemplo que muestra la diferencia práctica (y el peligro) entre var y no var . Aquí hay otro, lo encuentro particularmente peligroso porque la diferencia solo es visible en un entorno asíncrono por lo que puede deslizarse fácilmente durante la prueba.

Como era de esperar, el siguiente fragmento de código ["text"] :

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

console.log(var_fun())

Lo mismo ocurre con el siguiente fragmento de código (tenga en cuenta la ausencia antes de la array ):

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

console.log(var_fun())

La ejecución de la manipulación de datos de forma asíncrona 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 los 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)})
})


Cuando se ejecuta Javascript en un navegador, todo su código está rodeado por una declaración with, de este modo:

with (window) {
    //Your code
}

Más información sobre with - MDN

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

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

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

Una regla de oro 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 ámbito global es la window
  • No usar var declara implícitamente var 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 que declarar una variable sin var
  • Siempre declare var explícitamente porque es una buena práctica.

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

Cuando las variables se definen sin el uso de la palabra clave var, su aspecto 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 asignación. Cuando el intérprete 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 principio del contexto mediante un intérprete de javascript y esto se llama elevación)

También es posible que desee ver el levantamiento en javascript


Dentro de un código, si usa una variable sin usar var, 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 */
}

Este es un buen ejemplo de cómo puede salir 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>

(Se restablece en cada iteración del bucle, ya que no se declara localmente en el bucle for sino globalmente) y, finalmente, se obtiene un bucle infinito.


Si estás en el ámbito global, entonces no hay mucha diferencia. Lee Kangax's respuesta Kangax's para 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 alcance el alcance global (en qué punto 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ás haciendo una tarea, necesitas usar var :

var x; // Declare x

Siempre debe utilizar la palabra clave var para declarar variables. ¿Por qué? Una buena práctica de codificación debería ser una razón suficiente en sí misma, pero declarar una variable sin la palabra clave var 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 de JavaScript de Apple :

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

Entonces, en resumen, siempre declare variables usando la palabra clave var .


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

my_var;

No se puede trabajar en ámbito global o en cualquier otro ámbito . Debe ser con valor como:

my_var = "value";

Por otro lado puedes definir una variable similar;

var my_var;

Su valor undefined está undefined (su valor no es null y no es igual a null interesante).


Usar var es siempre una buena idea para evitar que las variables abarroten el alcance global y que las variables entren en conflicto entre sí, lo que provoca una sobrescritura no deseada.


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 en el ámbito global.

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

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


otra diferencia por ejemplo

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

mientras

a = a || [] ; // a is undefined error.




ecmascript-5