Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回此| |(0,eval)(';此';);_Javascript_Dot.js - Fatal编程技术网

Javascript 返回此| |(0,eval)(';此';);

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,这是因为全局对象

查看doT.js源代码:

这有什么用

(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
不必未定义。它可能是
错误
错误或其他错误。相关:另一个相关问题:(带答案)