查看 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 库/框架/等,它的一个全局标识符需要暴露给外部世界。
至于为什么不简单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。