在 currying 中,为什么外部的启动函数看起来是最里面的函数?

In currying why does the outside, initiating function appear to be the innermost function?

在简单的 2 层 currying 示例中,单词 dog 被传递到 y 参数中。

"use strict";

function layer2(x) {
    return function(y) {
        return console.log(x, y);
    }
}

var layer1 = layer2('cat');

layer1('dog');

我知道它是这样工作的,我可以可靠地重现它。但是我不明白为什么会这样。如果我制作了一个 100 层示例,第 1 层将是最内层的功能,并且该模式将从该点向外工作。这是什么基本机制造成的?非常感谢任何输入!

很简单。当您调用 layer2('cat') 时,它将 return 函数:

function(y) {
  return console.log(x, y);
}

现在,layer1('dog') returns 函数调用 return console.log(x,y); 已经在调用 layer2('cat') 中接收到 x,并且正在从 [=15= 调用 y ].

这是一个非常好的阅读博客https://javascriptweblog.wordpress.com/2010/10/25/understanding-javascript-closures/,它将进一步帮助您。

简而言之,词法作用域使这成为可能。请参阅示例中的 layer2 函数 returns 另一个在其范围内有两个变量的函数:

y - its own argument
x - parameter passed into `layer2` function

这里的关键点是,一旦您存储了返回的函数,x 值就已设置并且永远不会改变。同样,就您的示例而言,存储在 layer1 变量中的函数 - layer2('cat') 的结果 - 将 x 名称绑定到 'cat' 字符串值。