CSPとグローバルオブジェクトの取得

グローバルオブジェクト、通常のWeb上のJavaScriptではwindowオブジェクトのことになるが、最近のJavaScriptではWeb上で動くものとは限らないこともあって、汎用的に取れる手段が確立されている。

まぁ、通常は

var global = this;

で良い。

(function(global) {
  "use strict";
  // ...
}(this));

という書き方の方が一般的かもしれない。

ただし、ECMAScript5th の Strictモード環境下では、this がグローバルオブジェクトを指すことはなく undefined になってしまう。その場合、以下の様にすれば取得は可能だ。

"use strict";
var global = new Function("return this")()

この書き方が一番汎用性があると思っていたのだが、一つ問題が浮上した。

Web上ではよりセキュア性を高めるために、CSPが導入されつつあり、JavaScriptにも制限を加えることが可能になっている。*1

CSP policy directives | Mozilla Developer Networkoptionsセクションになるわけだが、eval-scriptを指定しない限り、evalFunctionコンストラクタの使用が不可能になるのだ。

そうなると、new Function("return this")()は使えないことになり、Strictモード環境下でグローバルオブジェクトを取得する手段がなくなってしまう。

僕個人として、関数毎に"use strict"を使うのは面倒なので、使うならグローバルな位置に"use strict"を書いて、コード全体をStrictモード環境にするようにしていた。しかし、上記のとおりグローバルオブジェクトを取得できない場合が出てきてしまい汎用性に欠けることが分かった。

はやり、

(function(global) {
  "use strict";
  // ...
}(this));

の書き方が一番良かったという結論になりそう。