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

标签 javascript functional-programming

我目前正在阅读 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 是用匿名函数的返回值调用的(这只是 callback 的返回值),但我不明白重构版本应该可以工作 - json 参数去哪儿了?我错过了什么?

最佳答案

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


你不会写......

var floor = function(x) { return Math.floor(x) }

相反,你会写......

var floor = Math.floor

…它的工作原理完全一样。这称为 Eta Conversion如果您重复两次,您将看到 Brian 如何在“最合适的指南”中得出他的结果。

Eta转换的基本规则是这样的:

<b>function(x) { return</b> f<b>(x) }</b> === f

……它们完全可以互换


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

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

先看看……

return ajaxCall(<b>function(json) { return</b> callback(<b>json</b>) <b>}</b>)

Eta 转换表示......

<b>function(json) { return</b> callback<b>(json) }</b> === callback

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

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

// eta converts to ...
var getServerStuff = function(callback) {
  return ajaxCall(callback)
}

我们应该觉得这种情况很熟悉。再进行一次 eta 转换将使我们得到最终的简化形式。我会再添加一次粗体,这样我们可以看得更清楚

Eta 转换表示......

<b>function(callback) { return</b> ajaxCall<b>(callback) }</b> === ajaxCall
// second step
var getServerStuff = <s>function(callback) {</s>
  <s>return </s>ajaxCall<s>(callback)</s>
<s>}</s>

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

无论出于何种意图和目的,它们都是可以互换的。 MoSTLy Adequate Guide to FP 很少关注动态绑定(bind)或使用 this

关于javascript - 这个例子中的论点在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38425893/

相关文章:

javascript - vuejs 在@click 事件中使用箭头函数

javascript - 如何在 twig 循环内打印 JS 函数的结果

javascript - 当前显示在 <select> 框中的项目的索引

javascript - 了解 Vue 中的全景缩放

javascript - 继续使用 mergeMap 在 RxJs pipeable 中出错

scala - 函数式 Scala 的重构/布局

javascript - stackoverflow如何创建模式对话框窗口?

c# - 在运行时从 C# 中的 ArrayList 生成自定义对象

javascript - 使用过滤器仅返回键的特定属性

function - 什么时候在 Go 中使用函数表达式而不是函数声明?