ECMAScript 5th の strict mode で global コンテキストを得るには
- stillpedant
- 4464
- 0
- 18
- 1
strict mode で [[Global]] ってどうやって得るのだろうか. this は使えないし. __parent__ とかか?
2010-10-16 00:13:01@stillpedant indirect eval call (eval という名前じゃない eval 呼び出し) がグローバルスコープで実行されるので。var e = eval, global = e('this'); でいいはず。
2010-10-16 00:19:56@edvakf なるほど, そんな手法があったのですね. indirect eval call ってブラウザによっては警告が出ますけど, strict mode でもいけるんですか. 勉強になりました.
2010-10-16 00:21:55@stillpedant ES3 では indirect eval は EvalError にしてもよいということになってるそうです。未確認。strict mode だけのトリックですね。
2010-10-16 00:23:21Indirect Eval Call は Global Context で評価される "IJS: Interactive JS Shell - Constellation Scorpius" - http://j.mp/ah3axL
2010-10-16 00:24:37operator commaの挙動を利用すればこんな黒いindirect call to evalも (eval,eval)("SCRIPT")
2010-10-16 00:28:32strict modeで必ずglobalを取るには, (new Function("return this"))(); で大丈夫.
2010-10-16 00:29:40strict modeはFunction constructor内には伝播しない. これはsection10.1.1をよく見ると, 実は除外されてる.
2010-10-16 00:30:50@Constellation new をつけない Function('return this')() でもいいのかな。
2010-10-16 00:50:56@edvakf 大丈夫ですー, constructorにpassingされるだけなので. なのでどこかにvar getGlobal = Function('return this'); ってやっておけば, それがstrict mode内で定義されていてもglobalが取れます.
2010-10-16 00:53:46getGlobal()をthis bindingをnullにして呼び出すことさえ守ればstrict mode内でも外でも, getGlobalの定義自体がstrict mode内でも外でもどこでもglobalを取れる. strict modeの逃げ道.
2010-10-16 00:57:04