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


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


1389
2017-09-24 08:54


origen


Respuestas:


Si estás en el ámbito global, entonces no hay diferencia.

Si estás en una función, entonces var creará una variable local, "no var" buscará la cadena de alcance hasta que encuentre la variable o alcance el alcance global (en ese punto lo 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, entonces debes usar var:

var x; // Declare x

1254
2017-09-24 08:55



Hay una diferencia.

var x = 1  declara variable  x en el ámbito 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 x contra la cadena de alcance Si lo encuentra en cualquier lugar de esa cadena de alcance, realiza la asignación; si no encuentra x, solo entonces crea x propiedad 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 podría ser confusa a menos que comprenda que declaraciones 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 DontDelete.

Dado que la declaración de variable crea propiedad con el indicador DontDelete, la diferencia entre var x = 1 y x = 1 (cuando se ejecuta en el alcance global) es que la primera declaración de una sola variable - crea la propiedad DontDelete'able, y la última no. Como consecuencia, la propiedad creada a través de esta asignación implícita se puede eliminar del objeto global, y la anterior, la creada a través de la declaración de variables, 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 los de IE).

Espero que todo tenga sentido:)


[Actualización 16/12/2010]

En ES5 (ECMAScript 5, recientemente estandarizada, 5ª edición del lenguaje) existe un llamado "modo estricto": un modo de lenguaje de aceptación, que cambia ligeramente el comportamiento de las tareas no declaradas. En modo estricto, la asignación a un identificador no declarado es ReferenceError. La razón de esto fue atrapar asignaciones accidentales, evitando la creación de propiedades globales no deseadas. Algunos de los navegadores más nuevos ya han comenzado a rodar la compatibilidad con el modo estricto. Ver, por ejemplo, mi tabla de compatibilidad.


695
2017-09-24 13:38



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

Sería mejor pensar que es la diferencia entre "local y más cercano". Lo 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;
    }
}

130
2017-09-24 09:50



Cuando se ejecuta Javascript en un navegador, todo su código está rodeado por una declaración con, como sigue:

with (window) {
    //Your code
}

Más información sobre with - MDN

Ya que var declara una variable en el alcance actual , no hay diferencia entre declarar var  ventana interior y no declararlo en absoluto.

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

Utilizando var le permite ocultar las variables externas que tienen el mismo nombre. De esta forma, 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 hacer hincapié en lo siguiente:

  • var declara una variable en el alcance actual
  • El alcance global es window
  • No usando var implícitamente declara var en el alcance global (ventana)
  • Declarar una variable en el alcance global (ventana) usando var es lo mismo que omitirlo.
  • Declarar una variable en ámbitos diferentes de la ventana usando var  no es lo mismo como declarar una variable sin var
  • Declarar siempre var explícitamente porque es una buena práctica

76
2017-09-24 09:17



Debieras siempre utilizar el var palabra clave 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 el var palabra clave significa que está declarado en el global alcance (una variable como esta se llama global "implícita"). Douglas Crockford recomienda nunca usar variables globales implícitasy según el Directrices de codificación JavaScript de Apple:

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

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


37
2017-09-24 09:52



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

<script>
one();

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

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

(i se restablece en cada iteración del ciclo, ya que no está declarado localmente en el for loop pero globalmente) eventualmente resultando en un ciclo infinito


27
2017-09-24 09:31



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

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

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

Para obtener más información, puede buscar "scope chain JavaScript" en Google.


12
2017-09-24 09:02



otra diferencia p.ej

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

mientras

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

8
2017-08-09 22:11



Utilizando var siempre es una buena idea evitar que las variables atemperen el ámbito global y las variables entren en conflicto entre ellas, lo que provoca sobreescritura no deseada.


7
2018-04-04 23:14



Sin var - variable global.

Muy recomendable para SIEMPRE utilizar var declaració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... */

7
2017-09-24 09:04