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()
を使う手法の方が便利ではあるのかなーと思いますが。