返回这个|| (0,EVAL)( '这');
查看doT.js源文件:
https://raw.github.com/olado/doT/master/doT.js
这是做什么的?
(function(){ return this || (0,eval)('this'); }()).doT = doT;
对我来说,它看起来像是在创build一个全局window.doT
。 如果这就是它的全部,那么为什么不呢?
window.doT = doT;
?
它获取全局对象的引用,以便将doT
分配给它。 这通常是因为使用JavaScript库/框架/等,其一个全局标识符需要暴露给外部世界 。
至于为什么它不是简单的window.doT = doT;
,这是因为全局对象并不总是window
,例如,在非浏览器环境中。 在执行这个代码的时候,也可以把window
分配到别的地方。
怎么运行的
如果this
已经是真的 ,例如,一个对象,如window
,它将返回。 这可能是window
(至less在浏览器中),因为普通的函数调用应该将其ThisBinding
设置为全局对象。 否则,它将在全局范围内执行eval()
,因为对eval()
的间接调用将其范围设置为全局范围,而不是调用环境的范围。
要实现间接调用,您必须间接调用eval()
,即不能只用eval()
调用它。 你可以使用(0, eval)
来调用它。 这依赖于逗号运算符返回最后一个评估expression式,在这种情况下是eval
。 前面的操作数是什么都没有关系。 同样, (0||eval)()
也可以。
至于为什么身体是this
,这是eval()
的参数,那就是要作为一个string执行的代码。 它将在全球范围内返回this
始终是全局对象。
它现在不是真的有关系,但是在较老的IE中,你需要使用execScript()
来执行全局范围内的代码。 我不记得究竟是什么版本的IE这是必要的。