归还这个|| (0,EVAL)('这&#39);

时间:2013-01-02 09:59:13

标签: javascript dot.js

查看doT.js来源:

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

这是做什么的?

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

对我而言,它似乎正在创建一个全局var window.doT。如果这就是它的全部,那么为什么不呢:

window.doT = doT;

1 个答案:

答案 0 :(得分:54)

它正在获取对全局对象的引用,以便为其分配doT。这通常是因为使用JavaScript库/框架/等,其一个全局标识符需要暴露给外部世界

至于为什么它不仅仅是window.doT = doT;,这是因为全局对象并不总是window,例如,在非浏览器环境中。在执行此代码时,也可以将window分配给其他位置。

如何运作

如果this已经 truthy ,例如window之类的对象,它将返回该对象。它可能是window(至少在浏览器中),因为普通函数调用应该将其ThisBinding设置为全局对象。否则,它将在全局范围内执行eval(),因为对eval()的间接调用会将其范围设置为全局,而不是调用环境的范围。

要实现间接呼叫,您必须间接调用eval(),即不能仅使用eval()调用它。您可以使用(0, eval)来调用它。这依赖于逗号运算符返回最后一个计算表达式,在本例中为eval。前面的操作数是什么并不重要。同样,(0||eval)()也可以。

至于为什么正文是this,这是eval()的参数,那就是要作为字符串执行的代码。它将返回全局范围中的this,它始终是全局对象。

现在它并不真正相关,但在较旧的IE中,您需要使用execScript()来执行全局范围内的代码。我不记得确切地说这是什么版本的IE。