__parent__のlexical scope, activation object

id:nanto_viさんに Twitter / TOYAMA Nao: @ku [[Scope]]内部プロパティが違う。f1.... で教えてもらったし要所翻訳部分を読んだら一発でした。

脆弱性、全てのサイトでGM_xmlhttpRequestを使う、解説と回避Bug 355590 – __parent__ should not expose lexical scope or activation objects

This is a standards violation and an optimization hazard. Trivial patch next.

って書かれてて、そうなの、としか思ってなかったけど、
10 実行コンテキスト (Execution Contexts)
13 関数定義 (Function Definition)
を読むと仕様では __parent__に入っている値は

  • withを使ったときにスコープチェインに追加されたもの
  • グローバルスコープ
  • sandobx実行時に指定されたオブジェクト
  • 13 関数定義 (Function Definition)の 生成規則 FunctionExpression : function Identifier( FormalParameterListopt ) { FunctionBody } で生成されるスコープ

のどれかでしかなさそう。

昨日の __parent__がやっぱりまだしっくりこなぃ - web newbie の不思議現象は、仕様書を読むと不思議現象でもなんでもなくて
13 関数定義 (Function Definition)に書かれているとおり、名前がついているかついていないかで適用される生成規則が違って、その違いでスコープチェインに追加されるかされないかの差があって、それが実装にきちんと反映されているから__parent__が違ってくるのだとわかった。

仕様書すばらしい。