alternativa - javascript>: eval
devuelve esto ||(0, eval)(''esto''); (1)
Es obtener una referencia al objeto global, para asignarle doT
. Esto generalmente se hace porque con una biblioteca / framework / etc de JavaScript, su único identificador global necesita estar expuesto al mundo exterior .
En cuanto a por qué no es simplemente window.doT = doT;
, es porque el objeto global no es siempre una window
, por ejemplo, en un entorno que no sea navegador. También es posible tener una window
asignada a otro lugar en el punto donde se ejecuta este código.
Cómo funciona
Si this
ya es cierto , por ejemplo, un objeto como la window
, devolverá eso. Es probable que sea una window
(al menos en el navegador), ya que una llamada de función simple debe tener su ThisBinding
configurado para el objeto global. De lo contrario, ejecutará eval()
en el ámbito global porque una llamada indirecta a eval()
establecerá su alcance en global, a diferencia del alcance del entorno de llamada.
Para lograr una llamada indirecta, debe invocar eval()
indirectamente, es decir, no puede simplemente llamarlo con eval()
. Puede usar (0, eval)
para invocarlo. Esto depende del operador de coma que devuelve la última expresión evaluada, en este caso eval
. No importa lo que sean los operandos anteriores. Del mismo modo, (0||eval)()
funcionaría.
En cuanto a por qué el cuerpo es this
, ese es el argumento para eval()
, que es el código que se ejecutará como una cadena. Devolverá this
en el ámbito global, que es siempre el objeto global.
No es realmente relevante hoy en día, pero en IEs más antiguas, necesitarías usar execScript()
para ejecutar código en el alcance global. No recuerdo exactamente para qué versiones de IE fue necesario.
Mirando la fuente doT.js:
https://raw.github.com/olado/doT/master/doT.js
¿Qué hace esto?
(function(){ return this || (0,eval)(''this''); }()).doT = doT;
Para mí, parece que está creando una var global, window.doT
. Si eso es todo lo que está haciendo, entonces ¿por qué no?
window.doT = doT;
?