Is var necessary when declaring Javascript variables?

If you don't declare a variable (explicitly creating it in the current scope) using var, let or const then (in non-strict mode) you create an implicit global.

Globals are a fantastic way to have different functions overwriting each other's variables (i.e. they make code a pain to maintain).

If you use var, the scope of the variable is limited to the current function (and anything inside it — it is possible to nest functions).

(const and let scope constants and variables to the current block instead of the function, this usually makes variables even easier to manage than var does.)

Google Adsense uses globals because it splits scripts into two distinct parts (one local and one remote). A cleaner approach would be to call a function defined in the remote script and pass the parameters as arguments instead of having it pick them up from the global scope.


Modern JS should be written in strict mode which bans implicit globals (preferring to explicitly declare them at the top level instead, thus prevent accidental globals when a variable name is typoed).


Yes, you should always use var.

Not using var has two major drawbacks:

  • Accessing a variable within a function that is not defined within that function will cause the interpreter to look up the scope chain for a variable with that name until either it find one or it gets to the global object (accessible in browsers via window) where it will create a property. This global property is now available everywhere, potentially causing confusion and hard-to-detect bugs;
  • Accessing an undeclared variable will cause an error in ECMAScript 5 strict mode.

Also, not using var for global variable is not exactly the same as using var: when using var, the property it creates on the global object has the internal DontDelete attribute, which is not the case without var:

// Next line works in any ECMAScript environment. In browsers, you can
// just use the window object.
var globalObj = (function() { return this; })();

var x = 1;
delete globalObj.x;
alert(x); // Alerts 1, x could not be deleted

y = 2;
delete globalObj.y;
alert(y); // Error, y is undefined