繁体   English   中英

逗号运算符会影响 Javascript 中的执行上下文吗?

[英]Does the comma operator influence the execution context in Javascript?

var a = 1;
var b = {
  a : 2,
  c : function () {
    console.log(this.a);
  }
};

b.c(); // logs 2
(b.c)(); // logs 2
(0, b.c)(); // logs 1

第一个是可以理解的,因为“this”指向对象“b”。 但是为什么第二个记录相同的结果? 我认为“this”应该指向全局执行上下文。 第三个,似乎逗号运算符会影响执行上下文。

你真的有一个很好的角落案例! 我的看法:

  • 第一个很简单。 只是一个标准的电话。 '.' 运算符允许您调用函数设置b作为执行上下文。
  • 第二个完全相同:括号是完全可选的,解释器将其中的表达式视为绑定函数调用。 其实我没想到这样的:我想解释将要重置this全局对象,但实际上它的保持它的联系。 可能只是这样“随意”的语言用户不会惊慌失措。
  • 第三个更标准(至少对于那些生活在 JavaScript 领域的人来说):只要你的函数在表达式中传递(在这种情况下是由,运算符), this值就会丢失。 这是因为bc是一个Property Reference (规范中的深度兔子洞细节, 这里,由 TJCrowder 提供)。 因此,您实际上是在传递函数本身,不再绑定到声明对象。 所以,当你把它this会作为全局对象传递。

这样看: (object.function)()被简化为object.function() ,因为封闭的括号是完全可选的; (0, object.function)()被解析为(expression yielding a function)()这将失去与thisobject绑定,因为函数已经解除绑定。

真的很好的例子!

请参阅Indirect eval call ,其中提供了有关它的更多详细信息。

 (     0        ,          b.c   )        (  )
     |____|   |_____|    |_____|
     Literal  Operator   Identifier

     |_________________________|
     Expression

  |______________________________|
  PrimaryExpression

  |______________________________|        |________|
  MemberExpression                        Arguments

  |________________________________________________|

  CallExpression

我们可以用逗号,以时尚间接调用bc这将迫使它在执行global context ,价值a1global context

(bc = bc)()也是1

> (b.c = b.c)()
  1

就 ECMAScript 而言,这是因为 - 逗号运算符(在(0, bc)示例中)和=运算符(在(bc = bc)示例中)对其操作数执行 GetValue。

其他间接调用格式如下

> (b.c, b.c)()
  1 
> (1? b.c: 0)()
  1
> (__ = b.c)()
  1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM