ECMAScript 5 の strict mode でグローバルオブジェクトを得るひとつの方法

ECMAScript 5th edition (JavaScript 系統のコア部分をまとめた言語みたいなもの) には strict mode というものがあり、strict mode では関数コード (Function Code) 内の this キーワードの参照先オブジェクトが、strict mode でない場合と異なる可能性があります。 例えば、関数式を即実行する Immediate Function Pattern (((function () { /* ... */ })(); という形式のもの。 特に正式名称があるわけではないと思いますが、『JavaScriptパターン ―優れたアプリケーションのための作法』 でこの名前が使われていたのでこの名前で呼んでいます)) と呼ばれる手法を使う際、strict mode でなければ関数コード内で this キーワードがグローバルオブジェクトを参照しますが、strict mode では未定義値 (undefined) になります。

詳しくは下記参照。

その対策として、id:think49 さんのところでは以下のように new Function() を利用する方法が紹介されています。

関数コードでは new Function() を利用します。

"use strict";

(function () {
  console.log(new Function('return this')()); // [object Window]
  console.log(Function('return this')());     // [object Window]
})();

グローバルコード (Global Code) からグローバルオブジェクトを渡す方法

別の方法としては、Immediate Function の引数としてグローバルオブジェクトを渡してやる方法もあります。 グローバルコードでは this キーワードはグローバルオブジェクトを参照するため、グローバルコードにおける Immediate Function に対しては、引数としてグローバルオブジェクトを渡してやることができます。

"use strict";

(function ( globalObj ) {
    // 引数 globalObj としてグローバルオブジェクトへの参照を受け取る
    print( globalObj ); // [object Window]
    // strict mode: Immediate Function 内の this キーワードは undefined
    print( this );      // undefined
})( this ); // グローバルコードにおける this はグローバルオブジェクト

どこででも使えるという意味では new Function() を使う手法の方が便利ではあるのかなーと思いますが。