MDN ではfor文の第一要素を初期化式(initial-expression)と説明している
概要
for文の第一要素で変数宣言するコードは次のようになります。
for (var i = 0; i < 10; i++) { alert(i); }
この時、var i = 0
が「式」であるかのように誤解されることがあるようです。
ECMAScript 3 では
ECMAScript 3 では ExpressionNoIn
と VariableDeclarationListNoIn
の2つにわけて説明されています。
for (ExpressionNoIn; Expression ; Expression ) Statement for ( var VariableDeclarationListNoIn; Expression ; Expression ) Statementhttp://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/12_Statements.html#section-12.6
VariableDeclarationListNoIn
では変数文 (VariableStatement) と同じように機能します。これは「式」ではありません。
for (var i = 0, length = 10; i < length; i++) { // 第一要素は VariableDeclarationListNoIn alert(i); }
ExpressionNoIn
では「式」をカンマ演算子で列挙できます。
var i, length; // VariableStatement for (i = 0, length = 10; i < length; i++) { // 第一要素は ExpressionNoIn alert(i); }
MDN では
MDNでfor文の第一要素の説明を見てみます。
構文
for ([initial-expression]; [condition]; [final-expression]) statementhttps://developer.mozilla.org/ja/JavaScript/Reference/Statements/forParameters
initial-expression
(代入式を含む) 式または変数宣言。たいていは、カウンタ変数を初期化するために使われます。この式では、var キーワードを用いて新しい変数を任意で宣言してもかまいません。これらの変数はループにローカルなものではありません。すなわち、これらは for ループが属するスコープと同じスコープ内にあります。この式の結果は捨て去られます。
"式または変数宣言" は正当な説明だと思いますが、大本は initial-expression
とあるので変数宣言も式であると勘違いされる可能性があります。
また、"この式では、var キーワードを用いて新しい変数を任意で宣言してもかまいません。" という記述は極めてわかりにくく、「var キーワードを使って代入式を宣言している」ようにも読み取れます。
『JavaScript第5版』では
『JavaScript第5版』(いわゆるサイ本)には次のように書かれています。
JavaScript第5版 P906.8 for文
...(中略)...
for文の書式は次のとおりです。for (initialize; test; increment) statementfor文の働きは、for文と同じ処理を行うwhile文と比較するとよくわかると思います。
initialize; while(test) { statement increment; }ループを行う前に initialize 式を1回だけ評価します。通常、initialize 式は代入などの副作用を伴います。JavaScript では、var文を使って変数を宣言することもできます。ループカウンタ変数の宣言と初期化が同時にできて便利です。...
やや複雑ですが、「initialize 式」と「変数宣言」をわけて解説されていることがわかります。「initialize 式」は英語にすれば "initial-expression" になりますから、MDN の 語源 出典はここにあるのかもしれません。ただ、"initial-expression" に変数宣言も含めるのは『JavaScript第5版』の著者の意図に反していると思います。
MDNから生じた勘違い
下記のような勘違いが生まれたことがありました。(説明の都合上、文面を多少換えています)
- 「
for (var i = 0, length = 10; i < length; i++)
という書き方もあるよ。」 - 「カンマ演算子を使っているのか。」
- 「カンマ演算子なんて出てきてないよ。」
- 「var a=1, b=2, c=3; をカンマ演算子というのか。勉強になった。」
- 「違うよ!全然違うよ!」
- 「MDCのfor文の説明には『for ([initial-expression]; [condition]; [final-expression]) (代入式を含む) 式または変数宣言。』とあるんだけど…。」(※現在のMDNは当時MDCという名前でした)
- 「var がついてなければ式。var がついていれば文。」
- 「なるほど。勉強になった。」
「変数宣言が式である -> 式であるならカンマ演算子が使えるはず」という流れ。確かに式ならカンマ演算子を使えますからそう解釈する気持ちは理解できます。
結論
for文の第一要素d変数初期化を行う場合、var を伴わない変数宣言は「式」ですが var を伴う変数宣言は「式」ではありません。var を伴う変数宣言を「文」と呼べるかは少し怪しい気もします(「文」なら "VariableStatement" を定義すればよく、わざわざ "var VariableDeclarationListNoIn" を定義しているところをみると「文」と区別されているように思えます)が、少なくとも「式」ではないと思います。
結論としては、MDN の "initial-expression" は「式のみを入れられる」という誤解を生むと思います。