43 votes

retourner cette || (0, eval) ('this');

En regardant la source doT.js:

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

Qu'est-ce que cela fait?

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

Pour moi, cela semble créer une variable globale, window.doT . Si c'est tout ce que vous faites, alors pourquoi pas:

 window.doT = doT;
 

?

56voto

alex Points 186293

Il devient une référence à l'objet global, afin d'assigner doT pour elle. Cela se fait généralement parce qu'avec une bibliothèque JavaScript/cadre/etc, une seule de ses identificateur global doit être exposé au monde extérieur.

Quant à savoir pourquoi il n'est pas simplement window.doT = doT;, c'est parce que l'objet global n'est pas toujours window, par exemple, dans un environnement de navigateur. Il est également possible d'avoir window affecté à un autre endroit au point de ce code est exécuté.

Comment ça marche

Si this est déjà truthy, par exemple, un objet tel qu' window, il sera de retour que. Il est probable qu'il sera window (au moins dans le navigateur), comme un simple appel de fonction doit avoir son ThisBinding ensemble de l'objet global. Sinon, il exécutera eval() dans la portée globale, car un appel indirect à l' eval() va définir son champ d'application au niveau mondial, par opposition à l'appel de l'environnement de la portée.

Pour réaliser un appel indirect, vous devez invoquer eval() indirectement, c'est à dire que vous ne pouvez pas simplement l'appeler avec un eval(). Vous pouvez utiliser (0, eval) pour l'appeler. Cela dépend de l'opérateur virgule retour de la dernière expression évaluée, dans ce cas - eval. Il n'a pas d'importance ce que le précédent opérandes sont. De même, (0||eval)() serait de travailler.

Quant à savoir pourquoi le corps est - this, qui est l'argument de eval(), qui est le code pour être exécuté comme un string. Il sera de retour l' this dans le contexte global, qui est toujours l'objet global.

Il n'est pas vraiment pertinent de nos jours, mais dans les anciens S, vous devez utiliser execScript() d'exécuter du code dans la portée globale. Je ne me souviens pas exactement quelles sont les versions de IE, cela a été nécessaire pour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X