web-dev-qa-db-ja.com

これを返す|| (0、eval)( 'this');

DoT.jsソースを見る:

https://raw.github.com/olado/doT/master/doT.js

これは何をしますか?

(function(){ return this || (0,eval)('this'); }()).doT = doT;

私には、グローバル変数window.doTを作成しているように見えます。それがすべてであるなら、なぜそうではありません:

window.doT = doT;

42
Fergal

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これが必要だったバージョンを正確に思い出せません。

55
alex