The variable statement declares a variable, optionally initializing it to a value.


var varname1 [= value1] [, varname2 [= value2] ... [, varnameN [= valueN]]];
Naam van de variabele. Het kan eender welke legale identifier (referentie) zijn.
De initiele waarde van een variabele. Het mag eender welke legale expressie zijn. De standaard waarde is "undefined" (ongedefinieerd).


Verklaringen van een variabele, waar ze ook voorkomen, worden verwerkt voordat een code wordt uitgevoerd. Het bereik van een variabele gedeclareerd met var is de huidige uitvoeringscontext, ofwel de insluitingsfunctie of, voor variabelen die buiten een functie worden gedeclareerd, globaal. Als je een Javascript variabele her-declareert, dan zal het zijn waarde niet verliezen.

Assigning a value to an undeclared variable implicitly creates it as a global variable (it becomes a property of the global object) when the assignment is executed. The differences between declared and undeclared variables are:

1. Declared variables are constrained in the execution context in which they are declared. Undeclared variables are always global.

function x() {
  y = 1;   // Throws a ReferenceError in strict mode
  var z = 2;


console.log(y); // logs "1" 
console.log(z); // Throws a ReferenceError: z is not defined outside x

2. Declared variables are created before any code is executed. Undeclared variables do not exist until the code assigning to them is executed.

console.log(a);                // Throws a ReferenceError.
console.log('still going...'); // Never executes.
var a;
console.log(a);                // logs "undefined" or "" depending on browser.
console.log('still going...'); // logs "still going...".

3. Declared variables are a non-configurable property of their execution context (function or global). Undeclared variables are configurable (e.g. can be deleted).

var a = 1;
b = 2;

delete this.a; // Throws a TypeError in strict mode. Fails silently otherwise.
delete this.b;

console.log(a, b); // Throws a ReferenceError. 
// The 'b' property was deleted and no longer exists.

Because of these three differences, failure to declare variables will very likely lead to unexpected results. Thus it is recommended to always declare variables, regardless of whether they are in a function or global scope. And in ECMAScript 5 strict mode, assigning to an undeclared variable throws an error.

var hoisting

Because variable declarations (and declarations in general) are processed before any code is executed, declaring a variable anywhere in the code is equivalent to declaring it at the top. This also means that a variable can appear to be used before it's declared. This behavior is called "hoisting", as it appears that the variable declaration is moved to the top of the function or global code.

bla = 2;
var bla;
// ...

// is implicitly understood as:

var bla;
bla = 2;

For that reason, it is recommended to always declare variables at the top of their scope (the top of global code and the top of function code) so it's clear which variables are function scoped (local) and which are resolved on the scope chain.

It's important to point out that the hoisting will affect the variable declaration, but not its value's initialization. The value will be indeed assigned when the assignment statement is reached:

function do_something() {
  console.log(bar); // undefined
  var bar = 111;
  console.log(bar); // 111

// is implicitly understood as: 
function do_something() {
  var bar;
  console.log(bar); // undefined
  bar = 111;
  console.log(bar); // 111



Declaring and initializing two variables

var a = 0, b = 0;

Assigning two variables with single string value

var a = 'A';
var b = a;

// Equivalent to:

var a, b = a = 'A';

Be mindful of the order:

var x = y, y = 'A';
console.log(x + y); // undefinedA

Here, x and y are declared before any code is executed, the assignments occur later. At the time "x = y" is evaluated, y exists so no ReferenceError is thrown and its value is 'undefined'. So, x is assigned the undefined value. Then, y is assigned a value of 'A'. Consequently, after the first line, x === undefined && y === 'A', hence the result.

Initialization of several variables

var x = 0;

function f() {
  var x = y = 1; // x is declared locally. y is not!

console.log(x, y); // Throws a ReferenceError in strict mode (y is not defined). 0, 1 otherwise. 
// In non-strict mode:
// x is the global one as expected
// y leaked outside of the function, though!

Implicit globals and outer function scope

Variables that appear to be implicit globals may be references to variables in an outer function scope:

var x = 0;  // x is declared within file scope, then assigned a value of 0

console.log(typeof z); // undefined, since z doesn't exist yet

function a() { // when a is called,
  var y = 2;   // y is declared within scope of function a, then assigned a value of 2

  console.log(x, y);   // 0 2 

  function b() {       // when b is called
    x = 3;  // assigns 3 to existing file scoped x, doesn't create a new global var
    y = 4;  // assigns 4 to existing outer y, doesn't create a new global var
    z = 5;  // creates a new global variable z and assigns a value of 5. 
  }         // (Throws a ReferenceError in strict mode.)

  b();     // calling b creates z as a global variable
  console.log(x, y, z);  // 3 4 5

a();                   // calling a also calls b
console.log(x, z);     // 3 5
console.log(typeof y); // undefined as y is local to function a


Specification Status Comment
ECMAScript 1st Edition (ECMA-262) Standard Initial definition. Implemented in JavaScript 1.0
ECMAScript 5.1 (ECMA-262)
The definition of 'var statement' in that specification.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'variable statement' in that specification.
ECMAScript Latest Draft (ECMA-262)
The definition of 'variable statement' in that specification.

Browser compatibility

Update compatibility data on GitHub
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome voor AndroidFirefox voor AndroidOpera voor AndroidSafari op iOSSamsung InternetNode.js
varChrome Volledige ondersteuning 1Edge Volledige ondersteuning 12Firefox Volledige ondersteuning 1IE Volledige ondersteuning 3Opera Volledige ondersteuning JaSafari Volledige ondersteuning JaWebView Android Volledige ondersteuning 1Chrome Android Volledige ondersteuning 18Firefox Android Volledige ondersteuning 4Opera Android Volledige ondersteuning JaSafari iOS Volledige ondersteuning JaSamsung Internet Android Volledige ondersteuning 1.0nodejs Volledige ondersteuning Ja


Volledige ondersteuning  
Volledige ondersteuning

See also