なぜこのコードはエラーを送出しますか?(関数eval(){})は、関数本体がstrictモードの場合に構文エラーをスローしますか?
// global non-strict code
(function eval() { 'use strict'; });
ライブデモ:http://jsfiddle.net/SE3eX/1/
だから、私たちがここに持っていることという名前の関数式です。この関数の式が非厳密なコードであることを明示的に指摘したいと思います。ご覧のように、関数本体は厳密なコードです。
strictモードのルールはここにある:http://ecma-international.org/ecma-262/5.1/#sec-C
関連弾丸はこの1つ(それはリストの最後の一つです)です:このルールにのみ適用方法
It is a SyntaxError to use within strict mode code the identifiers eval or arguments as the Identifier of a FunctionDeclaration or FunctionExpression or as a formal parameter name (13.1). Attempting to dynamically define such a strict mode function using the Function constructor (15.3.2) will throw a SyntaxError exception.
気付いた場合は、関数宣言/式自体は厳密なコードで表示されますが、上記の例ではではなくです。
でも、それでもエラーは発生しますか?どうして?
ここではまったく推測していますが、*式*では、名前を持つ関数のインスタンス化式はその関数内でのみ*その名前をバインドするという事実と関係しているかもしれません。言い換えれば、内部的には、関数への参照で初期化されたローカル変数を作成する 'var'宣言のためのいくつかの魔法のようなものです。したがって、グローバルシンボル "eval"をローカルにバインドしようとしているかのようです。 – Pointy
@Pointy良いヒント。そのシナリオで何が起こっているのかを確かめるために標準をチェックしなければならないでしょう... –
'function eval()だけのエラーメッセージ(SyntaxError:関数名は厳密なモードではevalや引数ではないかもしれません) {'厳密な使用'; }; ' – some