43

doT.jsソースを見る:

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

これは何をしますか?

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

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

window.doT = doT;

4

1 に答える 1

56

割り当てるために、グローバルオブジェクトへの参照を取得してdoTいます。これは通常、JavaScriptライブラリ/フレームワークなどでは、その1つのグローバル識別子を外部に公開する必要があるために行われます

単純ではない理由については、たとえば、ブラウザ以外の環境でwindow.doT = doT;は、グローバルオブジェクトが常に存在するとは限らないためです。このコードが実行された時点で別の場所に割り当てられてwindowいる可能性もあります。window

使い方

thisがすでに真実である場合、たとえば、などのオブジェクトはwindow、それを返します。プレーンな関数呼び出しではグローバルオブジェクトに設定するwindow必要があるため、(少なくともブラウザでは)そうなる可能性があります。それ以外の場合、への間接呼び出しは、呼び出し元の環境のスコープではなく、そのスコープをグローバルに設定するため、グローバルスコープでThisBinding実行されます。eval()eval()

間接呼び出しを実現するには、間接的に呼び出す必要があります。eval()つまり、で呼び出すことはできませんeval()。を使用(0, eval)して呼び出すことができます。これは、最後に評価された式(この場合は)を返すコンマ演算子に依存していますeval。前のオペランドが何であるかは関係ありません。同様に、(0||eval)()動作します。

本体がなぜであるかというとthis、それはへの引数でありeval()、それは文字列として実行されるコードです。this常にグローバルオブジェクトであるグローバルスコープでを返します。

execScript()最近はあまり関係ありませんが、古いIEでは、グローバルスコープでコードを実行するために使用する必要があります。これが必要だったIEのバージョンを正確に思い出せません。

于 2013-01-02T10:02:04.217 に答える