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のバージョンを正確に思い出せません。