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.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がすでに真実である場合、たとえば、などのオブジェクトはwindow、それを返します。プレーンな関数呼び出しではグローバルオブジェクトに設定するwindow必要があるため、(少なくともブラウザでは)そうなる可能性があります。それ以外の場合、への間接呼び出しは、呼び出し元の環境のスコープではなく、そのスコープをグローバルに設定するため、グローバルスコープでThisBinding実行されます。eval()eval()
間接呼び出しを実現するには、間接的に呼び出す必要があります。eval()つまり、で呼び出すことはできませんeval()。を使用(0, eval)して呼び出すことができます。これは、最後に評価された式(この場合は)を返すコンマ演算子に依存していますeval。前のオペランドが何であるかは関係ありません。同様に、(0||eval)()動作します。
本体がなぜであるかというとthis、それはへの引数でありeval()、それは文字列として実行されるコードです。this常にグローバルオブジェクトであるグローバルスコープでを返します。
execScript()最近はあまり関係ありませんが、古いIEでは、グローバルスコープでコードを実行するために使用する必要があります。これが必要だったIEのバージョンを正確に思い出せません。