--- title: var slug: Web/JavaScript/Reference/Statements/var tags: - JavaScript translation_of: Web/JavaScript/Reference/Statements/var ---
O variable
statement declara uma variável, opcionalmente é possível atribuir à ela um valor em sua inicialização.
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
varnameN
valueN
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.
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.
var a = 0, b = 0;
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.
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á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
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition | Standard | Primeira definição. Implementada no JavaScript 1.0 |
{{SpecName('ES5.1', '#sec-12.2', 'var statement')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-variable-statement', 'variable statement')}} | {{Spec2('ES6')}} |
{{ CompatibilityTable() }}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} | {{ CompatVersionUnknown() }} |