ご存知かもしれませんが、JavaScript の厳密モードでは、識別子eval
、 およびに制限が追加されarguments
、実質的に予約語になりますが、次の 2 つの例外があります。
- それらはまだ式として使用できます。つまり、式が期待される場所で使用できます (ただし、いくつかの例外があります)。
- これらは引き続きラベル名として使用でき、
break
/continue
ステートメントでラベルを参照するために使用できます。
これで、最初の箇条書きがわかりました。たとえば、識別子が式として許可されていない場合 (および真の予約語が許可されていない場合)、関数をまったくeval
呼び出すことができません( is は式であるため)。同じことが言えます-要素にアクセスできるようにするために、式として使用できる必要があります(例:)。eval
eval(str)
arguments
arguments[0]
ただし、この規則には 3 つの例外があります。eval
/arguments
は、(1) 代入の左辺の式として (例: eval = true;
)、(2) ++
/のオペランドとして--
(例: eval++
)、(3) (delete
例: ) のオペランドとして現れない場合がありますdelete eval
。ただし、これらは唯一の例外であり、他のすべての式コンテキストでは有効です。
私が理解していないのは、2番目の箇条書きです。なぜ今でもラベル名として使用できるのですか? たとえば、次のコードは厳密モードでも有効です。
eval: for ( var i = 0; i < 10; i++ ) {
arguments: for ( var j = 0; j < 10; j++ ) {
if ( i < j ) continue eval;
console.log( i - j );
}
}
continue eval;
がラベルを参照する方法であり、実際の機能eval
とは何の関係もないことに注意してください。eval
また、真の予約語はラベル名として使用できないことに注意してください。私の理解では、厳密モードの意図は、名前eval
を 、およびarguments
可能な限り予約語のようにすることでした。それでは、なぜそれらを有効なラベル名として保持するのでしょうか?