我目前正在阅读
Mostly Adequate Guide on functional programming,chapter 2.
在那里,给出了以下示例
var getServerStuff = function(callback) { return ajaxCall(function(json) { return callback(json); }); };
然后重构为:
var getServerStuff = ajaxCall;
在解释重构时,作者认为
return ajaxCall(function(json) { return callback(json); });
是相同的
return ajaxCall(callback);
虽然我理解ajaxCall是用匿名函数的返回值调用的(这只是回调的返回值),但我不知道重构版本应该如何工作 – json参数在哪里?我错过了什么?
解决方法
问题已得到解答,但我认为一些粗体和删除线使得很容易看到代码转换.希望这个答案可以帮助那些正在努力想象这个问题的人.
你不会写……
var floor = function(x) { return Math.floor(x) }
相反,你会写…
var floor = Math.floor
……它将完全相同†.这被称为Eta Conversion,如果你重复两次,你会看到Brian如何在最充分的指南中得到他的结果.
Eta转换的基本规则是:
function(x) { return f(x) } === f
……它们完全可以互换†
您可以在原始代码中使用相同的技术
var getServerStuff = function(callback) { return ajaxCall(function(json) { return callback(json) }) }
先看看……
return ajaxCall(function(json) { return callback(json) })
Eta转换说……
function(json) { return callback(json) } === callback
那么让我们看看整个代码与第一次eta转换的结果……
// first step var getServerStuff = function(callback) { return ajaxCall(function(json) {returncallback(json)}) } // eta converts to ... var getServerStuff = function(callback) { return ajaxCall(callback) }
这种情况对我们来说应该很熟悉.另外一个eta转换将把我们带到最终的简化形式.我将再添加一次加粗,以便我们可以更好地看到它
Eta转换说……
function(callback) { return ajaxCall(callback) } === ajaxCall
// second step var getServerStuff =function(callback) {returnajaxCall(callback)}// eta converts to ... var getServerStuff = ajaxCall
†无论出于何种目的,它们都是可以互换的. FP的充分指南很少关注动态绑定或使用它