javascript – 这个例子中的参数在哪里?

前端之家收集整理的这篇文章主要介绍了javascript – 这个例子中的参数在哪里?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在阅读 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) {
    return callback(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) {
  return ajaxCall(callback)
}

// eta converts to ...
var getServerStuff = ajaxCall

†无论出于何种目的,它们都是可以互换的. FP的充分指南很少关注动态绑定或使用它

猜你在找的JavaScript相关文章