43

查看 doT.js 源代码:

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

这是做什么的?

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

对我来说,它看起来像是在创建一个全局变量,window.doT. 如果这就是它所做的一切,那么为什么不呢:

window.doT = doT;

?

4

1 回答 1

56

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

至于为什么不简单window.doT = doT;,那是因为全局对象并不总是window,例如,在非浏览器环境中。在执行此代码时,也可能已window分配给其他地方。

这个怎么运作

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

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

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

现在它并不真正相关,但在较旧的 IE 中,您需要用于execScript()在全局范围内执行代码。我不记得确切需要哪个版本的 IE。

于 2013-01-02T10:02:04.217 回答