DoT.jsソースを見る:
https://raw.github.com/olado/doT/master/doT.js
これは何をしますか?
(function(){ return this || (0,eval)('this'); }()).doT = doT;
私には、グローバル変数window.doT
を作成しているように見えます。それがすべてであるなら、なぜそうではありません:
window.doT = doT;
?
doT
を割り当てるために、グローバルオブジェクトへの参照を取得しています。これは通常、JavaScriptライブラリ/フレームワークなどでは、その1つのグローバル識別子を外部世界に公開する必要があるために行われます。
単に_window.doT = doT;
_ではない理由については、たとえば、ブラウザ以外の環境では、グローバルオブジェクトが常にwindow
であるとは限らないためです。このコードが実行された時点で、window
を別の場所に割り当てることもできます。
this
がすでにtruthyである場合、たとえばwindow
などのオブジェクトは、それを返します。プレーンな関数呼び出しではwindow
をグローバルオブジェクトに設定する必要があるため、(少なくともブラウザでは)ThisBinding
になる可能性があります。それ以外の場合は、eval()
を間接的に呼び出すと、呼び出し元の環境のスコープではなく、スコープがグローバルに設定されるため、グローバルスコープでeval()
が実行されます。
間接呼び出しを実現するには、eval()
を間接的に呼び出す必要があります。つまり、eval()
で呼び出すことはできません。 _(0, eval)
_を使用して呼び出すことができます。これは、最後に評価された式(この場合はeval
)を返すコンマ演算子に依存しています。上記のオペランドが何であるかは関係ありません。同様に、_(0||eval)()
_も機能します。
本体がthis
である理由、つまりeval()
の引数、つまり文字列として実行されるコードです。常にグローバルオブジェクトであるグローバルスコープでthis
を返します。
最近はあまり関係ありませんが、古いIEでは、グローバルスコープでコードを実行するためにexecScript()
を使用する必要があります。 IEこれが必要だったバージョンを正確に思い出せません。