这个例子中的论点在哪里?

Sve*_*ven 6 javascript functional-programming

我目前正在阅读关于函数式编程的最充分指南,第2章.

在那里,给出了以下示例

var getServerStuff = function(callback) {
  return ajaxCall(function(json) {
    return callback(json);
  });
};
Run Code Online (Sandbox Code Playgroud)

然后重构为:

var getServerStuff = ajaxCall;
Run Code Online (Sandbox Code Playgroud)

在解释重构时,作者认为

return ajaxCall(function(json) {
  return callback(json);
});
Run Code Online (Sandbox Code Playgroud)

是相同的

return ajaxCall(callback);
Run Code Online (Sandbox Code Playgroud)

虽然我理解ajaxCall用匿名函数的返回值调用(这只是返回值callback),但我不知道重构版本应该如何工作 - json参数在哪里?我错过了什么?

Tha*_*you 5

问题已得到解答,但我认为一些粗体删除线使得很容易看到代码转换.希望这个答案可以帮助那些正在努力想象这个问题的人.


你不会写......

var floor = function(x) { return Math.floor(x) }
Run Code Online (Sandbox Code Playgroud)

相反,你会写...

var floor = Math.floor
Run Code Online (Sandbox Code Playgroud)

......它将完全相同.这被称为Eta转换,如果你重复两次,你会看到Brian如何在最充分的指南中得到他的结果.

Eta转换的基本规则是:

function(x) { return f(x) } === f
Run Code Online (Sandbox Code Playgroud)

......他们完全可以互换


您可以在原始代码中使用相同的技术

var getServerStuff = function(callback) {
  return ajaxCall(function(json) {
    return callback(json)
  })
}
Run Code Online (Sandbox Code Playgroud)

先看看......

return ajaxCall(function(json) { return callback(json) })
Run Code Online (Sandbox Code Playgroud)

Eta转换说......

function(json) { return callback(json) } === callback
Run Code Online (Sandbox Code Playgroud)

那么让我们看看整个代码与第一次eta转换的结果......

// first step
var getServerStuff = function(callback) {
  return ajaxCall(function(json) {
    return callback(json)
  })
}

// eta converts to ...
var getServerStuff = function(callback) {
  return ajaxCall(callback)
}
Run Code Online (Sandbox Code Playgroud)

这种情况对我们来说应该很熟悉.另外一个eta转换将使我们进入最终的简化形式.我将再添加一次加粗,以便我们可以更好地看到它

Eta转换说......

function(callback) { return ajaxCall(callback) } === ajaxCall
Run Code Online (Sandbox Code Playgroud)
// second step
var getServerStuff = function(callback) {
  return ajaxCall(callback)
}

// eta converts to ...
var getServerStuff = ajaxCall
Run Code Online (Sandbox Code Playgroud)

所有意图和目的,它们是可以互换的.FP的充分指南显示对动态绑定或使用的几乎没有关注this

  • 嘿,谢谢你的回答!虽然我理解这个伟大的问题,加粗/删除线确实帮了我很多吧,所以我接受你的答案.这是我有史以来最神奇的事情! (2认同)