2

次のコード:

console.log((var a=5; ++a));

var関数ではなくステートメントと見なされるため、コンパイルされません。以下はコンパイルします:

console.log((a=5, ++a));

予想どおり、単語は 6 を出力しますが、外部の名前空間を汚染する可能性があります。以下のように、クロージャーを導入せずに最初のスニペットを機能させる方法はありますか?

console.log((function(a){return ++a})(5))

これは JavaScript を対象とするコンパイラ用であるため、回答は要件を尊重する必要があります。

4

2 に答える 2

4

いいえ、少なくとも ECMAScript 言語仕様のバージョン 5.1 の時点では、現在の最新のブラウザー JS はそこに基づいています。

あなたがするときconsole.log(- 次に来るのはArgumentList.

それ自体には、AssignmentExpression.

代入式は次のとおりです。

条件式:

LeftHandSideExpression AssignmentOperator AssignmentExpression

完全を期すために、この部分をさらに調査することをお勧めしますが、それらは実際には役に立ちません (a || 3たとえばa && 6

さて、もう一方の分岐はConditionalExpressionNoIn三項演算子です。(つまり、?:、省略形の if)。また、簡単な調査で式のみを実行することがわかります。

一方、左側の式では関数式を使用できますが、ステートメントを開くのに本当に役立つものは他にありません。

一方、avarは 2 か所に表示されます。、VariableStatementまたは明示的に for のような反復構造内。これらは両方とも、AssignmentExpression には表示できません。

したがって、前の回答が示唆するように。仕様に準拠した JavaScript の実装では、要求されている種類の構文は許可されません。このリスト内でステートメントを許可する唯一の式は、実際には関数式です。

于 2013-09-18T07:42:06.663 に答える
2

いいえ、関数を導入しないとできません。ステートメントの上で変数を宣言するだけです。

于 2013-09-18T07:23:35.123 に答える