ECMAScript 5th の strict mode で global コンテキストを得るには

ECMAScript 5th の strict mode で global コンテキストを得る方法について.
5
mooz @stillpedant

strict mode で [[Global]] ってどうやって得るのだろうか. this は使えないし. __parent__ とかか?

2010-10-16 00:13:01
Atsushi Takayama @edvakf

@stillpedant indirect eval call (eval という名前じゃない eval 呼び出し) がグローバルスコープで実行されるので。var e = eval, global = e('this'); でいいはず。

2010-10-16 00:19:56
mooz @stillpedant

@edvakf なるほど, そんな手法があったのですね. indirect eval call ってブラウザによっては警告が出ますけど, strict mode でもいけるんですか. 勉強になりました.

2010-10-16 00:21:55
Atsushi Takayama @edvakf

@stillpedant ES3 では indirect eval は EvalError にしてもよいということになってるそうです。未確認。strict mode だけのトリックですね。

2010-10-16 00:23:21
mooz @stillpedant

Indirect Eval Call は Global Context で評価される "IJS: Interactive JS Shell - Constellation Scorpius" - http://j.mp/ah3axL

2010-10-16 00:24:37
mooz @stillpedant

@edvakf へー, そうだったんですか. 予想外です. 色々面白いですねえ.

2010-10-16 00:25:21
Atsushi Takayama @edvakf

攻撃目的で alert = eval とかされてるのを嫌ってのことなんだろうか。

2010-10-16 00:28:19
小倉唯 @Constellation

operator commaの挙動を利用すればこんな黒いindirect call to evalも (eval,eval)("SCRIPT")

2010-10-16 00:28:32
小倉唯 @Constellation

strict modeで必ずglobalを取るには, (new Function("return this"))(); で大丈夫.

2010-10-16 00:29:40
小倉唯 @Constellation

strict modeはFunction constructor内には伝播しない. これはsection10.1.1をよく見ると, 実は除外されてる.

2010-10-16 00:30:50
Atsushi Takayama @edvakf

@Constellation new をつけない Function('return this')() でもいいのかな。

2010-10-16 00:50:56
小倉唯 @Constellation

@edvakf 大丈夫ですー, constructorにpassingされるだけなので. なのでどこかにvar getGlobal = Function('return this'); ってやっておけば, それがstrict mode内で定義されていてもglobalが取れます.

2010-10-16 00:53:46
小倉唯 @Constellation

getGlobal()をthis bindingをnullにして呼び出すことさえ守ればstrict mode内でも外でも, getGlobalの定義自体がstrict mode内でも外でもどこでもglobalを取れる. strict modeの逃げ道.

2010-10-16 00:57:04