这两个功能如何等效?

时间:2019-05-08 04:51:31

标签: javascript first-class-functions

我正在阅读一本书,该书通常是足够的指南,在关于First Class函数的章节中,我碰到了这个示例。有人可以向我解释吗?

它说下面两行相等。

// ignorant
const getServerStuff = callback => ajaxCall(json => callback(json));

// enlightened
const getServerStuff = ajaxCall;

这是两者相等的原因:

// this line
ajaxCall(json => callback(json));

// is the same as this line
ajaxCall(callback);

// so refactor getServerStuff
const getServerStuff = callback => ajaxCall(callback);

// ...which is equivalent to this
const getServerStuff = ajaxCall; // <-- look mum, no ()'s

但是我不能理解这部分。这两个当量如何?

// this line
ajaxCall(json => callback(json));

// is the same as this line
ajaxCall(callback);

有人可以用外行的方式解释吗?

1 个答案:

答案 0 :(得分:3)

它们是等效的,因为第一行引入了一个匿名函数,该函数除了将其参数转发到BitVector XXXRegisterInfo::getReservedRegs(const MachineFunction &MF) const { BitVector Reserved(getNumRegs()); Reserved.set(XXX::REGX); return Reserved; } 并返回callback的返回值外不执行任何操作。

通常来说,除了将其参数转发给其他函数callback并返回结果之外,什么都不做的函数x可以由内部y函数代替。 y没有做任何有意义的事情。

因此,给定一个函数x ...

x

在这里我们定义一个函数function x(arg) { return y(arg) } x的目的是接受参数x并调用arg。但是,如果已经拥有y(arg),并且已经拥有y(arg),我们已经可以调用y了:只需调用arg 。为此,我们不需要引入新功能y(arg)


值得注意的是,您的问题中的两行仅在x用一个参数调用其回调时才等效。为了使它们真正相等,第一行需要转发所有参数:

ajaxCall