Javascript 返回此| |(0,eval)(';此';);
查看doT.js源代码: 这有什么用Javascript 返回此| |(0,eval)(';此';);,javascript,dot.js,Javascript,Dot.js,查看doT.js源代码: 这有什么用 (function(){ return this || (0,eval)('this'); }()).doT = doT; 在我看来,它似乎正在创建一个全局变量,window.doT。如果这就是它所做的一切,那么为什么不: window.doT = doT; ?它获取对全局对象的引用,以便为其分配点。这通常是因为对于JavaScript库/框架/etc,它的一个全局标识符需要对外公开 至于为什么它不是简单的window.doT=doT,这是因为全局对象
(function(){ return this || (0,eval)('this'); }()).doT = doT;
在我看来,它似乎正在创建一个全局变量,window.doT
。如果这就是它所做的一切,那么为什么不:
window.doT = doT;
?它获取对全局对象的引用,以便为其分配
点。这通常是因为对于JavaScript库/框架/etc,它的一个全局标识符需要对外公开
至于为什么它不是简单的window.doT=doT代码>,这是因为全局对象并不总是窗口
,例如,在非浏览器环境中。也可以在执行此代码时将窗口
分配到其他地方
工作原理
如果此
已经是真实的,例如,一个对象,如窗口
,它将返回该值。它很可能是窗口
(至少在浏览器中),因为普通函数调用应该将其ThisBinding
设置为全局对象。否则,它将在全局作用域中执行eval()
,因为对eval()
的间接调用将其作用域设置为全局,而不是调用环境的作用域
要实现间接调用,必须间接调用eval()
,即不能仅使用eval()
调用它。您可以使用(0,eval)
来调用它。这取决于逗号运算符返回最后计算的表达式,在本例中为eval
。前面的操作数是什么并不重要。类似地,(0 | | eval)(
也可以工作
至于为什么主体是this
,这是eval()
的参数,这是要作为字符串执行的代码。它将返回全局范围内的this
,它始终是全局对象
这在当今并不重要,但在较旧的IE中,您需要使用execScript()
在全局范围内执行代码。我记不清什么版本的IE需要它。为什么this | | |(0,eval)('this')
?所谓“间接”,你是指(0,eval)(args)
?(0,eval)('this')
和eval('this')的区别是什么
从结果的角度来看?后者将在包含作用域的环境中执行,其中ThisBinding
可能不同。如果强制计算eval
,作为表达式将其作用域更改为全局,那么(eval)(
是否也会工作?如果此未定义,那为什么发出eval('this')
会有帮助呢?因为(42,eval)
会让人毛骨悚然@TravisJ此
不必未定义。它可能是
错误
或
错误或其他错误。相关:另一个相关问题:(带答案)