_ = _ => _(_); _(_)是什么意思?

时间:2019-04-16 19:07:37

标签: javascript

我刚刚遇到了这段代码

_=_=>_(_);_(_)

,它是用JavaScript编写的。我不知道这是怎么回事。这个笑脸代码是什么意思?

1 个答案:

答案 0 :(得分:9)

取消语法:

  • _=… implicitly declares a global variable名为_,并为其分配右侧表达式的结果。除非变量已在其他位置声明,否则这将在strict mode中引发错误。
  • _=>…是一个arrow function,也称为lambda expression,它接受​​名为_的参数(它将遮盖全局变量的名称)并返回的结果。右边的表达式。
  • _(_)像调用function一样调用参数_,并传入_作为该函数的第一个参数。之所以可行,是因为JavaScript具有first-class functions功能,因此它们可以用作其他函数的参数或从函数中返回(并非在所有语言中都是如此)。

到目前为止,_=_=>_(_);创建了一个higher-order function,它接受​​一个函数作为参数并以其自身作为参数调用该第二个函数,然后将其分配给名为_的全局变量。

  • 最后一个_(_)将使用相同的全局变量_作为参数调用全局变量_

结果将很快得到stack overflow,因为这实际上是recursive function,没有任何转义条件。但是,现代浏览器很可能会通过抛出error而不是仅仅崩溃而优雅地摆脱无限递归。

try {
    _=_=>_(_);_(_)
} catch (error) {
    console.log(error.toString());
}