は(私は最近this questionで見た)次の抜粋from ECMA-262 v5.1検討:なぜキャッチ句に独自のレキシカル環境があるのですか?
A語彙環境をECMAScriptのコードの字句入れ子構造に基づいて、特定の変数および関数への識別子の関連付けを定義するために使用される仕様のタイプであります。レキシカル環境は、環境レコードと、場合によっては、外部レキシカル環境へのヌル参照とからなる。通常、レキシカル環境は、FunctionDeclaration、WithStatement、TryStatementのCatch節などのECMAScriptコードの特定の構文構造に関連付けられ、そのようなコードが評価されるたびに新しいレキシカル環境が作成されます。
私は、関数が行うようcatch
節のボディは独自の変数をホイストう意味と思ったが、どうやらthat's not the case:
var a = 1;
try {
console.log(x); // ReferenceError
} catch(ex) {
console.log(a); // 1, not undefined
var a = 3;
}
誰もがなぜ知っていますか?また、catch
句にはそれ自身のレキシカル環境が必要なのはなぜですか?
"可能であれば外部の語彙環境への参照。"ヌルでなくてもいいことを意味し、ヌルでない場合は、グローバル変数がうまく見つかるでしょう。 –
@ Mike'Pomax'Kamermans私は、実際には、「キャッチ」にグローバル変数をシャドーイングする独自のローカル変数があると予想していました。しかし、そのために作成されたレキシカル環境は別のタイプのものです(Bergiの答えと[10.3]の仕様を参照してください(http://www.ecma-international.org/ecma-262/5.1/#sec -10.3))。 – bfavaretto