我正在阅读一本书,该书通常是足够的指南,在关于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);
有人可以用外行的方式解释吗?
答案 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