Sumário
O variable
statement declara uma variável, opcionalmente é possível atribuir à ela um valor em sua inicialização.
Sintaxe
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
varnameN
- Nome da variável. Pode ser utilizado qualquer identificador legal.
valueN
- Valor inicial da variável. Pode ser qualquer expressão legal.
Descrição
Declarações de variáveis, onde quer que elas ocorram, são processadas antes que qualquer outro código seja executado. O escopo de uma variável declarada com var
é seu contexto atual em execução, o qual é a função a qual pertence ou, para variáveis declaradas fora de qualquer função, o escopo é o global.
Atribuir um valor a uma variável não declarada anteriormente implica em criar uma variável global (ela se torna uma propriedade do objeto global) quando a atribuição é executada. As diferenças entre uma variável declarada e uma não delcarada são:
1. Variáveis declaradas estão relacionadas com o contexto de execução quando elas são criadas (por exemplo, uma função, objeto). Por outro lado, as variaveis não declaradas sempre são globais.
function x() { y = 1; // Lança a exceção ReferenceError em modo restrito (strict mode) var z = 2; } x(); console.log(y); // logs "1" console.log(z); // Lança a exceção ReferenceError: z não foi definida fora da função x()
2. Variáveis declaradas são criadas antes de qualquer código ser executado. As variáveis não declaradas não existem até quando o código atribuir um valor a ela.
console.log(a); // Lança a exceção ReferenceError. console.log('still going...'); // Nunca será executado.
var a; console.log(a); // mostra "undefined" ou "" dependendo do naveador. console.log('still going...'); // mostra "still going...".
3. Variáveis declaradas são propriedades não configuráveis no contexto de execução (função ou global). Variaveis não declaradas são configuráveis (por exemplo, podem ser excluídas).
var a = 1; b = 2; delete this.a; // Lança a exceção TypeError em modo restrito(strict mode). Caso contrário, Falha silenciosamente. delete this.b; console.log(a, b); // Throws a ReferenceError. // A propriedade 'b' foi deletada e não existe mais.
Por conta dessas três diferenças, falha para declarar variáveis, muito provavelmente, levar a resultados inesperados. Então, é recomendado sempre declarar as variáveis, independentemente se as variáveis estão em escopo de função ou escopo global. E o modo restrito (strict mode) do ECMAScript 5 sempre lançará uma exceçao quando o código atribuir um valor a uma variável não declarada.
var hoisting
Como as declarações de variáveis (e declarações em geral) são processadas antes de qualquer código seja executado, declarar uma variável em qualquer lugar no código é equivalente a declarar no inicio. Isso também significa que uma variável pode aparecer para ser usada antes dela ser declarada. Esse comportamento é chamado de "hoisting", a variável é movida para o inicio da função ou do código global.
bla = 2 var bla; // ... // é implicitamente entendido como: var bla; bla = 2;
Por essa razão, recomenda-se sempre declarar variáveis na parte superior do seu escopo de aplicação (o topo do código global e a parte superior do código da função). Por isso, é claro que as variáveis são função de escopo (local) e que são resolvidos na cadeia de escopo.
Exemplos
Declarando e inicializando duas variáveis
var a = 0, b = 0;
Atribuindo duas variáveis com uma única expressão
var a = "A"; var b = a; // Equivalente a: var a, b = a = "A";
É sempre importante lembrar da ordem da declaração das variáveis:
var x = y, y = 'A'; console.log(x + y); // undefinedA
Então, x e y são declarados antes de qualquer código seja executado, a atribuição ocorre posteriormente. Quando "x = y" for executado, y existe e nenhum exceção ReferenceError é lançada, e o valor de y será considerado como 'undefined
'. Por este motivo, este valor é atribuido a x. Depois disso, o valor 'A' é atribuido a variável y. Consequentemente, depois da primeira linha, x === undefined && y === 'A', então o resultado.
Iniciando diversas variáveis
var x = 0; function f(){ var x = y = 1; // x é declarado localmente,y não é! } f(); console.log(x, y); // 0, 1 // x é uma variável global como experado // y vazou para fora da função!
Variável global implícita e fora do escopo da função
Variáveis que aparecem como variáveis globais implicitas podem ser referenciadas como variáveis fora do escopo da função:
var x = 0; // x é declarada como global e é igual a 0 console.log(typeof z); // undefined, desde que z não tenha sido criada anteriormente function a() { // quando a for chamada, var y = 2; // y é declarada como local desta função, e o valor 2 é atribuido console.log(x, y); // 0 2 function b() { // quando b for chamado, x = 3; // atribui o valor 3 a variável global existente, ele não cria uma nova variável global y = 4; // atribui o valor 4 a uma variável fora, ele não cria uma nova variável z = 5; // cria uma nova variável global e atribui o valor 5. } // (Lança a exceção ReferenceError em modo restrito.) b(); // chamando b, o código irá criar z como variável global console.log(x, y, z); // 3 4 5 } a(); // chamando a, também irá chamar b console.log(x, z); // 3 5 console.log(typeof y); // indefinido já que y é uma variável local da função a
Especificação
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition | Standard | Primeira definição. Implementada no JavaScript 1.0 |
ECMAScript 5.1 (ECMA-262) The definition of 'var statement' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'variable statement' in that specification. |
Standard |
Compatibilidade dos Navegadores
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |