Disallow Undeclared Variables (no-undef)

Any reference to an undeclared variable causes a warning, unless the variable is explicitly mentioned in a /*global ...*/ comment. This rule provides compatibility with JSHint’s and JSLint’s treatment of global variables.

This rule can help you locate potential ReferenceErrors resulting from misspellings of variable and parameter names, or accidental implicit globals (for example, from forgetting the var keyword in a for loop initializer).

Rule Details

The following code causes 2 warnings, as the globals someFunction and b have not been declared.

var a = someFunction();  // 'someFunction' is not defined.
b = 10;                  // 'b' is not defined.

In this code, no warnings are generated, since the global variables have been properly declared in a /*global */ block.

/*global someFunction b:true*/
var a = someFunction();
b = 10;

By default, variables declared in /*global */ are considered read-only. Assignment to a read-only global causes a warning:

/*global b*/
b = 10;                  // 'b' is read only.

Use the variable:true syntax to indicate that a variable can be assigned to.

/*global b:true*/
b = 10;

Explicitly checking an undefined identifier with typeof causes no warning.

if (typeof UndefinedIdentifier === "undefined") {
    // do something ...


For convenience, JSHint and JSLint provide shortcuts that pre-define global variables exposed by popular libraries and runtime environments. This rule supports some of these environments, as listed below.


Defines common browser globals. Globals that should not be used in production (such as alert, console, etc.) are not included.

/*jslint browser:true*/
setTimeout(function() {


Defines globals for Node.js development.

/*jshint node:true*/
var fs = require("fs");
module.exports = function() {

When Not To Use It

If explicit declaration of global variables is not to your taste.

Further Reading


This rule was introduced in ESLint 0.0.9.