为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript中的(1,eval)('this')vs eval('this')?

JavaScript中的(1,eval)('this')vs eval('this')?

青春有我 2019-08-09 17:35:07
JavaScript中的(1,eval)('this')vs eval('this')?我开始阅读JavaScript模式,一些代码让我困惑。var global = (function () {     return this || (1, eval)('this');}());这是我的问题:Q1:(1, eval) === eval?为什么以及如何运作?Q2:为什么不呢var global = (function () {     return this || eval('this');}());要么 var global = (function () {     return this;}());
查看完整描述

3 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

(1,eval)和旧的区别在于eval前者是一个而后者是一个左值。如果是其他标识符会更明显:

var x;x = 1;(1, x) = 1; //  syntax error, of course!

这是(1,eval)一个表达式eval(就像说,(true && eval)(0 ? 0 : eval)将会),但它不是一个引用eval

你为什么在乎?

好了,规范了Ecma认为一个参考,以eval成为一个“直接的eval通话”,但只是产生一个表达式eval是一间接一-和间接的eval调用保证了在全球范围内执行。

我还不知道的事情:

  1. 在什么情况下直接eval调用不在全局范围内执行?

  2. 在什么情况下this,全局范围内的函数不会产生全局对象?

可以在这里收集更多信息。

编辑

显然,我的第一个问题的答案是“几乎总是”。直接eval当前范围执行。请考虑以下代码:

var x = 'outer';(function() {
  var x = 'inner';
  eval('console.log("direct call: " + x)'); 
  (1,eval)('console.log("indirect call: " + x)'); })();

毫不奇怪(嘿嘿),这打印出来:

direct call: inner
indirect call: outer

编辑

经过更多的实验,我将暂时说this不能设置为nullundefined。它可以设置为其他假值(0,'',NaN,false),但只是非常刻意。

我要说你的来源患有轻度和可逆的颅 - 直肠反转,并且可能想考虑在Haskell中花一周的编程。


查看完整回答
反对 回复 2019-08-09
?
largeQ

TA贡献2039条经验 获得超7个赞

Q1:用逗号分隔的多个连续javascript语句取最后一个语句的值。所以:

(1, eval)获取最后一个的值,该值是函数的函数引用eval()。它显然是这样做的,使eval()调用成为间接eval调用,将在ES5的全局范围内进行评估。细节在这里解释。

Q2:必须有一些环境没有定义全局this,但确实定义了eval('this')。这是我能想到的唯一原因。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 603 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信