纵观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
已经是truthy,例如,一个对象,如window
,它会返回。 很可能这将是window
(在浏览器中至少),作为一个普通的函数调用应该有其ThisBinding
设置为全局对象。 否则,将执行eval()
在全球范围内,因为间接调用eval()
将其范围设置为全球性的,而不是调用环境的范围。
为了实现间接调用,你必须调用eval()
间接,即你不能只是把它eval()
您可以使用(0, eval)
来调用它。 这依赖于逗号运算符返回最后计算的表达式,在这种情况下eval
。 不要紧,前面的操作数是什么。 同样, (0||eval)()
会工作。
至于为什么体是this
,即自变量eval()
即作为字符串要执行的代码。 这将返回this
在全球范围内,这始终是全局对象。
这不是真正相关的今天,但在旧的IE中,你需要使用execScript()
在全球范围内执行代码。 我不记得IE的什么版本,这是必要的。