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
参数在哪里?我错过了什么?
问题已得到解答,但我认为一些粗体和删除线使得很容易看到代码转换.希望这个答案可以帮助那些正在努力想象这个问题的人.
你不会写......
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
归档时间: |
|
查看次数: |
176 次 |
最近记录: |