大抵ブラウザで動くJavaScriptでは、global objectといえばwindowです。それをwindow識別子を使わずに取得する方法の紹介です。
windowでアクセス出来るのになぜこんなことが必要かというと、今後node.jsなどブラウザで実行されないJavaScriptが増えてくるに従って、色々な環境で動くライブラリなどを作成する際に問題になることが多いためです。
以前は、次の方法が一般的でした。
var global = (function() { return this; }).call();
関数リテラルからthisを参照すると、仕様上それがglobal objectになります。しかしstrict modeでは上記のコードが動作しません。
"use strict";
var global = (function() { return this; })();
alert(global);
ECMAScript 5に準拠している環境では、上記のglobalにはundefinedが入ってしまいます。それを解決するには次の様にします。
"use strict";
var global = Function('return this;')();
alert(global);
Functionオブジェクトにはstrict modeの伝播が届かないために、上記のようなコードが可能となっています。他にもindirect eval callを利用する方法もあります(本質的には同じ話ですね)。セキュリティ的にむずむずする感じがしますが、strict modeの場合はこうやるしかglobal objectを取得することが出来ません。