6

私は「学習ノード」の本を読んでいて、非常に単純な問題で立ち往生していました。それは、あまり考えていませんでした。JavaScriptでの割り当てです。

著者は、ノードのREPLを使用することにより、以下がundefinedを返すことを理解する必要があると述べています。

var a = 2
(undefined)

以下のコードはREPLで「2」を返します。

a = 2
2

何故ですか?すぐ上のコードは帰属ではありませんか?どうして?変数'a'がコード内のその時点まで存在していなかった場合、どうして存在しないのでしょうか。

4

4 に答える 4

7

ECMA-262§12.2によると、VariableStatement(つまりvar identifier=value)は明示的に何も返しません。さらに、VariableStatementはステートメントです。ステートメントは値を返しません。また、式が配置される場所にステートメントを配置することは無効です。

たとえば、次のいずれも、価値を生み出す式が必要な場所にステートメントを配置するため、意味がありません。

var a = var b;
function fn() { return var x; }

§11.13.1に従い、変数()に割り当てると、割り当てられた値identifier=value返されます。


を書くと、その値をvar a = 1;宣言して初期化します。これはVariableStatementであるため、何も返さず、REPLはを出力します。a1undefined

a=1に割り当てる式1ですa。がないためa、JavaScriptは通常のコードで暗黙的にグローバル を作成します(ただし、厳密モードで新しいグローバルを暗黙的に作成することは許可されていないため、厳密モードでaをスローします)。ReferenceError

以前に存在したかどうかに関係なくa、式は割り当てられた値を返す1ため、REPLはそれを出力します。

于 2012-11-01T16:03:25.190 に答える
1

ここで推測するだけで、これはおそらくECMAScript 5th Editionの仕様を参照することで確認できます(ただし、これは面倒です)。おそらく、「var」ステートメントの仕様と「グローバル」オブジェクトへの属性の割り当てに関係しています。 。

変数を宣言してそれに値を割り当てると(var a=2)、戻り値は「未定義」である可能性があります。これは、仕様で「var」ステートメントが返す必要があるためです。

「var」ステートメントを使用せずに変数をシンボルに割り当てると、実際にはその名前のグローバルオブジェクトの属性に値が割り当てられます。つまり、a=2言うことと同じでありwindow.a=2、属性に値を割り当てると、割り当てられた値が返されることがわかります。

于 2012-11-01T15:33:38.483 に答える
1

var a = 2ステートメントです。したがって、それは価値がありません。

于 2012-11-01T15:34:14.327 に答える
1

ステートメントリストを評価しています。ステートメントリストを評価するとき、最後の値を生成するステートメントの値が返されます。http://ecma-international.org/ecma-262/5.1/#sec-12.1-このセクションの最後にある例に注意してください。リスト内のステートメントが値を返さなかった場合、何も返されません(これはundefinedJavaScriptの場合です)。

変数ステートメントは、値を返しません。http://ecma-international.org/ecma-262/5.1/#sec-12.2

代入演算子は、値を返します(そして代入を実行します)。http://ecma-international.org/ecma-262/5.1/#sec-11.13.1

于 2012-11-01T16:02:14.257 に答える