JavaScript:;x(x)(v)“;语法意义?

JavaScript:;x(x)(v)“;语法意义?,javascript,Javascript,在阅读和欣赏Eric Elliot的函数编程方法的同时,我决定重温arrow函数。考虑到这一点,我发现Jason Orendorff在2015年发表了一篇关于MDN黑客的文章。在文章的末尾,我遇到了lambda演算示例,该示例使用箭头函数传输到ES6,如下所示: 下面是一个数学家可以使用Church的λ符号编写的“程序”的例子: fix = λf.(λx.f(λv.x(x)(v)))(λx.f(λv.x(x)(v))) 等效的JavaScript函数如下所示: var fix = f =>

在阅读和欣赏Eric Elliot的函数编程方法的同时,我决定重温arrow函数。考虑到这一点,我发现Jason Orendorff在2015年发表了一篇关于MDN黑客的文章。在文章的末尾,我遇到了lambda演算示例,该示例使用箭头函数传输到ES6,如下所示:

下面是一个数学家可以使用Church的λ符号编写的“程序”的例子:

fix = λf.(λx.f(λv.x(x)(v)))(λx.f(λv.x(x)(v)))
等效的JavaScript函数如下所示:

var fix = f => (x => f(v => x(x)(v)))
               (x => f(v => x(x)(v)));
我还应该补充一点,我已经在代码上尝试了Babel transpiler,它仍然返回与x(x)(v)中几乎相同的语法:

传送到

"use strict";

var fix = function fix(f) {
  return function (x) {
    return f(function (v) {
      return x(x)(v);
    });
  };
};
让我困惑的部分是
函数(v){returnx(x)(v)}
部分,尤其是
x(x)(v)
?这个语法是什么意思

一定有一些简单的事情让我逃避,但我似乎在任何地方都找不到答案。非常感谢你的建议。谢谢大家!

x(x)(v)
是两个链式函数调用
x(x)
返回一个函数,然后用
v
作为参数调用该函数。这相当于:

const y = x(x);  // y is a function
y(v);
具体例子:

const x = function(foo) { return function(bar) { console.log(bar); } };
const y = x(x);
y(v);

在对这个语法到底是什么以及它如何正确工作进行了更多的研究之后,我发现x(x)(v)仅仅是一个iLife(立即调用的函数表达式)。我相信巴贝尔不会传输它,因为它是一个遗留符号。正如James在对原始问题的评论中提到的,“这种行为很久以前就出现在javascript中了”

如果你想要更多的信息,你只需要知道上面的内容,正确地使用你的搜索词。虽然很难说是最起码的,但这里提到的“快速示例”应该能引导你朝着正确的方向前进。因此,以前在stackoverflow上用“”以及在quora上用“”回答了一个类似的问题

“x(x)(v)语法是什么?”这一特定问题会让大多数人感到困惑,因为x(x)周围没有括号,如下所示:

x(x)(v) == (x(x))(v)
这是完全不同的,大多数人现在会马上知道,(v)只是x(x)生命的一个论点

对于最简单的示例,请尝试以下代码:

function x (val) {return (val)};

var v = "v_variable";

console.log(x(x)(v));
或者这个片段:

函数x(val){return(val)};
函数修复(v){
var v=“我是结果变量,由x(x)(v)IIFE成功返回”;
返回x(x)(v)
//返回(x(x))(v)
};
document.getElementById(“demo”).innerHTML=fix()

Ivoking x(x)(v)iLife返回的结果与普遍接受且广为人知的(x(x))(v)iLife表示法相同


您知道这是在哪里记录的吗?不是特别的语法;这只是普通函数调用语法的一个“聪明”用法:很抱歉打扰您,但是您愿意提供一个简单算术函数提供的代码工作示例吗?var fix=f=>(x=>f(v=>x(x)(v)))这是不可能的,因为现有的简单算术函数都不返回函数。但是,本指南可能有助于解释返回函数的函数:这只是两个函数调用,每个函数调用之后都会调用。感谢您的快速回复!你知道这是在哪里记录的吗?
。你知道这是在哪里记录的吗-函数执行语法应该包含在任何基础JavaScript初学者指南、文档、书籍或MDN网页(如Feifanz linked)中。这种行为很久以前就在JavaScript中出现了,只是没有以这种形式出现。看看如何@James谢谢你的提示!我应该提到,我确实使用了巴贝尔的transpiler,希望弄清楚到底发生了什么。令我惊讶的是,“返回x(x)(v)”仍然存在。
function x (val) {return (val)};

var v = "v_variable";

console.log(x(x)(v));