§13.1は、あなたのような場合に何が起こるべきかを概説しています:
- 厳密モードのFunctionDeclarationまたはFunctionExpressionのFormalParameterList内で、識別子の値が複数回出現する場合は、SyntaxErrorです。
- 識別子"eval"または識別子"arguments"が厳密モードFunctionDeclarationまたはFunctionExpressionの--FormalParameterList内で発生する場合、これはSyntaxErrorです。
- 識別子"eval"または識別子"arguments"が厳密モードFunctionDeclarationまたはFunctionExpressionの識別子として発生する場合はSyntaxErrorです。
強調鉱山。strict-mode関数の識別子はeval
、したがって、SyntaxError
です。ゲームオーバー。
上記が「厳密モードの関数式」である理由を確認するには、§13(関数定義)のセマンティック定義を参照してください。
プロダクション
FunctionExpression:function
Identifier opt (
FormalParameterListoptFunctionBodyは次のよう
に評価されます。 ) {
}
- FormalParameterListoptで指定されたパラメーターと、FunctionBodyで指定されたbodyを使用して、13.2で指定された新しいFunctionオブジェクトを作成した結果を返します。実行中の実行コンテキストのLexicalEnvironmentをスコープとして渡します。FunctionExpressionが厳密なコードに含まれている場合、またはそのFunctionBodyが厳密なコードである場合は、trueをStrictフラグとして渡します。
強調鉱山。上記は、関数式(または宣言)がどのように厳密になるかを示しています。(平易な英語で)それが言うことは、FunctionExpressionがstrict
2つのシナリオにあるということです:
- コンテキストから呼び出され
use strict
ます。
- その関数本体はで始まります
use strict
。
あなたの混乱は、実際には関数式全体がであるのに、関数本体だけがであると考えることから生じます。あなたの論理は直感的ですが、JSがどのように機能するかではありません。strict
strict
ECMAscriptがこのように機能する理由がわからない場合は、非常に簡単です。これがあるとしましょう:
// look ma, I'm not strict
(function eval() {
"use strict";
// evil stuff
eval(); // this is a perfectly legal recursive call, and oh look...
// ... I implicitly redefined eval() in a strict block
// evil stuff
})();
ありがたいことに、関数式全体にとしてフラグが付けられているため、上記のコードはスローされstrict
ます。