JavaScript applications consist of statements with an appropriate syntax. A single statement may span multiple lines. Multiple statements may occur on a single line if each statement is separated by a semicolon. This isn't a keyword, but a group of keywords.
Statements and declarations by category
For an alphabetical listing see the sidebar on the left.
Control flow
Block
- A block statement is used to group zero or more statements. The block is delimited by a pair of curly brackets.
break
- Terminates the current loop, switch, or label statement and transfers program control to the statement following the terminated statement.
continue
- Terminates execution of the statements in the current iteration of the current or labeled loop, and continues execution of the loop with the next iteration.
Empty
- An empty statement is used to provide no statement, although the JavaScript syntax would expect one.
if...else
- Executes a statement if a specified condition is true. If the condition is false, another statement can be executed.
switch
- Evaluates an expression, matching the expression's value to a case clause, and executes statements associated with that case.
throw
- Throws a user-defined exception.
try...catch
- Marks a block of statements to try, and specifies a response, should an exception be thrown.
Declarations
var
- Declares a variable, optionally initializing it to a value.
let
- Declares a block scope local variable, optionally initializing it to a value.
const
- Declares a read-only named constant.
Functions and classes
function
- Declares a function with the specified parameters.
function*
- Generator Functions enable writing iterators more easily.
async function
- Declares an async function with the specified parameters.
return
- Specifies the value to be returned by a function.
class
- Declares a class.
Iterations
do...while
- Creates a loop that executes a specified statement until the test condition evaluates to false. The condition is evaluated after executing the statement, resulting in the specified statement executing at least once.
for
- Creates a loop that consists of three optional expressions, enclosed in parentheses and separated by semicolons, followed by a statement executed in the loop.
-
for each...in
- Iterates a specified variable over all values of object's properties. For each distinct property, a specified statement is executed.
for...in
- Iterates over the enumerable properties of an object, in arbitrary order. For each distinct property, statements can be executed.
for...of
- Iterates over iterable objects (including arrays, array-like objects, iterators and generators), invoking a custom iteration hook with statements to be executed for the value of each distinct property.
while
- Creates a loop that executes a specified statement as long as the test condition evaluates to true. The condition is evaluated before executing the statement.
Others
debugger
- Invokes any available debugging functionality. If no debugging functionality is available, this statement has no effect.
export
- Used to export functions to make them available for imports in external modules, another scripts.
import
- Used to import functions exported from an external module, another script.
label
- Provides a statement with an identifier that you can refer to using a
break
orcontinue
statement.
-
with
- Extends the scope chain for a statement.
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition (ECMA-262) The definition of 'Statements' in that specification. |
Standard | Initial definition |
ECMAScript 3rd Edition (ECMA-262) The definition of 'Statements' in that specification. |
Standard | |
ECMAScript 5.1 (ECMA-262) The definition of 'Statements' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'ECMAScript Language: Statements and Declarations' in that specification. |
Standard | New: function*, let, for...of, yield, class |
ECMAScript Latest Draft (ECMA-262) The definition of 'ECMAScript Language: Statements and Declarations' in that specification. |
Living Standard |
Browser compatibility
Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Legacy generator function | No | No | 2 — 58 | No | No | No |
async function | 55 | Yes | 52 | No | 42 | 10.1 |
block | Yes | Yes | Yes | Yes | Yes | Yes |
break | Yes | Yes | Yes | Yes | Yes | Yes |
class | 42 | Yes | 45 | No | ? | 10.1 |
const | 21 | Yes | 361 2 | 11 | Yes | 5.1 |
continue | Yes | Yes | Yes | Yes | Yes | Yes |
debugger | Yes | Yes | Yes | Yes | Yes | Yes |
do...while | Yes | Yes | Yes | 6 | Yes | Yes |
Empty statement (; ) | Yes | Yes | Yes | Yes | Yes | Yes |
export | 61 | 16 153 | 544 | No | 47 | 10.1 |
for | Yes | Yes | Yes | Yes | Yes | Yes |
for each...in | No | No | 1.5 — 57 | No | No | No |
for...in | Yes | Yes | Yes | 6 | Yes | Yes |
for...of | 38 | 12 | 135 | No | 25 | 8 |
function | Yes | Yes | Yes | Yes | Yes | Yes |
function* | 39 | 13 | 26 | No | 26 | 10 |
if...else | Yes | Yes | Yes | Yes | Yes | Yes |
import | 61 | 16 153 | 544 | No | 47 | 10.1 |
label | Yes | Yes | Yes | Yes | Yes | Yes |
let | 41 | 12 | 446 7 8 | 11 | 17 | 10 |
return | Yes | Yes | Yes | Yes | Yes | Yes |
switch | Yes | Yes | Yes | Yes | Yes | Yes |
throw | Yes | Yes | Yes | Yes | Yes | Yes |
try...catch | Yes | Yes | Yes | 6 | Yes | Yes |
var | Yes | Yes | Yes | Yes | Yes | Yes |
while | Yes | Yes | Yes | Yes | Yes | Yes |
with | Yes | Yes | Yes | Yes | Yes | Yes |
Feature | Android webview | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Legacy generator function | No | No | No | 4 — 58 | No | No | No |
async function | Yes | 55 | Yes | 52 | No | 42 | 10.1 |
block | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
break | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
class | 42 | 42 | Yes | 45 | No | ? | 10.1 |
const | Yes | Yes | Yes | 361 2 | 11 | Yes | Yes |
continue | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
debugger | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
do...while | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
Empty statement (; ) | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
export | No | 61 | Yes | 544 | No | 47 | 10.1 |
for | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
for each...in | No | No | No | 4 — 57 | No | No | No |
for...in | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
for...of | 5.1 | Yes | 12 | Yes | No | 25 | 8 |
function | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
function* | Yes | 39 | Yes | 26 | No | Yes | 10 |
if...else | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
import | No | 61 | Yes | 544 | No | 47 | 10.1 |
label | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
let | 41 | 41 | 12 | 446 7 8 | ? | 17 | 10 |
return | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
switch | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
throw | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
try...catch | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
var | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
while | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
with | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
1. Prior to Firefox 13, const
is implemented, but re-assignment is not failing.
2. Prior to Firefox 46, a TypeError
was thrown on redeclaration instead of a SyntaxError
.
3. From version 15: this feature is behind the Experimental JavaScript Features
preference.
4. From version 54: this feature is behind the dom.moduleScripts.enabled
preference. To change preferences in Firefox, visit about:config.
5. Prior to Firefox 51, using the for...of
loop construct with the const
keyword threw a SyntaxError
("missing = in const declaration").
6. Prior to Firefox 44, let
is only available to code blocks in HTML wrapped in a <script type="application/javascript;version=1.7">
block (or higher version) and has different semantics (e.g. no temporal dead zone).
7. Prior to Firefox 46, a TypeError
is thrown on redeclaration instead of a SyntaxError
.
8. Firefox 54 adds support of let
in workers.