`for 语句`用于创建一个循环，它包含了三个可选的表达式，三个可选的表达式包围在圆括号中并由分号分隔， 后跟一个在循环中执行的语句（通常是一个块语句）。

## 语法

    for ([initialization]; [condition]; [final-expression])
       statement

`initialization`
  一个表达式 (包含赋值语句) 或者变量声明。典型地被用于初始化一个计数器。该表达式可以使用`var`关键字声明新的变量。初始化中的变量不是该循环的局部变量，而是与`for`循环处在同样的作用域中。该表达式的结果无意义。
`condition`
  一个条件表达式被用于确定每一次循环是否能被执行。如果该表达式的结果为true， `statement` 将被执行。 这个表达式是可选的。如果被忽略，那么就被认为永远为真。如果计算结果为假，那么执行流程将被跳到`for`语句结构后面的第一条语句。
`final-expression`
  每次循环的最后都要执行的表达式。执行时机是在下一次`condition`的计算之前。通常被用于更新或者递增计数器变量。
`statement`
  只要`condition`的结果为true就会被执行的语句。 要在循环体内执行多条语句，使用一个块语句（`{ ... }`）来包含要执行的语句。没有任何语句要执行，使用一个空语句（`;`）。

## 示例

### 使用 `for`

以下例子声明了变量`i`并被初始赋值为`0`，`for`语句检查`i`的值是否小于9，如果小于9，则执行语句块内的语句，并且最后将`i`的值增加 1。

    for (var i = 0; i < 9; i++) {
       console.log(i);
       // more statements
    }

### 可选的`for`表达式

`for`语句的所有的表达式都是可选的

例如，初始化块中的表达式没有被指定：

    var i = 0;
    for (; i < 9; i++) {
        console.log(i);
        // more statements
    }

像初始化块一样，条件块也是可选的。如果省略此表达式，则必须确保在循环体内跳出，以防创建死循环。

    for (var i = 0;; i++) {
       console.log(i);
       if (i > 3) break;
       // more statements
    }

你当然可以忽略所有的表达式。同样的，确保使用了`break`语句来跳出循环并且还要修改（增加）一个变量，使得break 语句的条件在某个时候是真的。

    var i = 0;

    for (;;) {
      if (i > 3) break;
      console.log(i);
      i++;
    }

### 使用无语句的`for`

以下 `for` 循环计算 [final-expression] 部分中节点的偏移位置 ，它不需要执行一个 `statement` 或者一组 `block statement` ，因此使用了空语句。

    function showOffsetPos(sId) {

      var nLeft = 0, nTop = 0;

      for (

        var oItNode = document.getElementById(sId); /* initialization */

          oItNode; /* condition */

        nLeft += oItNode.offsetLeft, nTop += oItNode.offsetTop, oItNode = oItNode.offsetParent /* final-expression */

      ); /* semicolon */

      console.log('Offset position of \'' + sId + '\' element:\n left: ' + nLeft + 'px;\n top: ' + nTop + 'px;');

    }

    /* Example call: */

    showOffsetPos('content');

    // Output:
    // "Offset position of "content" element:
    // left: 0px;
    // top: 153px;"

提示：这是JavaScript中的少数几种情况，其中分号是强制性的。实际上，没有分号，循环声明之后的行将被视为语句。

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript Latest Draft (ECMA-262) for statement | Draft |
ECMAScript 2015 (6th Edition, ECMA-262) for statement | Standard |
ECMAScript 5.1 (ECMA-262) for statement | Standard |
ECMAScript 3rd Edition (ECMA-262) for statement | Standard |
ECMAScript 1st Edition (ECMA-262) for statement | Standard | Initial definition

## 浏览器兼容

The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

| Desktop | Mobile | Server
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js
`for` | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes

### Legend

Full support
  Full support

## 另请参阅

- `break`
- `continue`
- `empty`
- `while`
- `do...while`
- `for...in`
- `for...of`