我刚刚遇到了这段代码
_=_=>_(_);_(_)
,它是用JavaScript编写的。我不知道这是怎么回事。这个笑脸代码是什么意思?
答案 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());
}