返回此|| (0,EVAL)( '这');(return this || (0,

2019-08-05 06: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;

Answer 1:

这是越来越全局对象的引用,以分配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的什么版本,这是必要的。



文章来源: return this || (0,eval)('this');