【问题标题】:return this || (0,eval)('this');返回这个 || (0,eval)('this');
【发布时间】:2013-01-02 09:59:12
【问题描述】:

看doT.js源码:

https://raw.github.com/olado/doT/master/doT.js

这是做什么的?

(function(){ return this || (0,eval)('this'); }()).doT = doT;

在我看来,它正在创建一个全局变量window.doT。如果这就是它所做的一切,那为什么不呢:

window.doT = doT;

?

【问题讨论】:

标签: javascript dot.js


【解决方案1】:

它正在获取对全局对象的引用,以便将doT 分配给它。这通常是因为使用 JavaScript 库/框架/等,它的一个全局标识符需要暴露给外部世界

至于为什么不是简单的window.doT = doT;,这是因为全局对象并不总是window,例如在非浏览器环境中。也可以在执行此代码时将window 分配给其他地方。

工作原理

如果this 已经是真实,例如window 之类的对象,它将返回它。它很可能是window(至少在浏览器中),因为普通函数调用应该将其ThisBinding 设置为全局对象。否则,它将在全局范围内执行 eval(),因为间接调用 eval() 会将其范围设置为全局,而不是调用环境的范围。

要实现间接调用,您必须间接调用eval(),即不能只使用eval() 调用它。您可以使用(0, eval) 来调用它。这依赖于返回最后一个计算表达式的逗号运算符,在本例中为 eval。前面的操作数是什么并不重要。同样,(0||eval)() 也可以。

至于为什么body是this,就是eval()的参数,就是要作为字符串执行的代码。它将返回全局范围内的this,它始终是全局对象。

现在它并不真正相关,但在旧版 IE 中,您需要使用 execScript() 在全局范围内执行代码。我不记得确切需要哪个版本的 IE。

【讨论】:

  • 为什么是this || (0,eval)('this')
  • “间接”是指(0,eval)(args)吗?
  • 从结果来看(0,eval)('this')eval('this')有什么区别?
  • 后者将在包含作用域的环境中执行,其中ThisBinding 可能不同。
  • 如果强制 eval 被评估(不是双关语),因为表达式将其范围更改为全局,(eval)() 不也可以工作吗?
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多