我最近开始学习JS,这是我第一次进入功能语言领域。
正在做"蹦床"在functional-javascript-workshop
npm模块中练习,并且在我自己的解决方案和官方解决方案之间遇到了一个有趣的区别。两者都工作得很好,但我不知道它们之间究竟有什么实际区别。我非常了解自己的解决方案,但并不完全理解另一个解决方案的原因。
我的解决方案
function repeat(op, num) {
var _repeat = function() {
if (num <= 0) return;
op();
return repeat(op, --num);
};
return _repeat;
}
function trampoline(f) {
while (f instanceof Function) {
f = f();
}
return f;
}
module.exports = function(op, num) {
return trampoline(repeat(op, num));
};
官方解决方案
function repeat(operation, num) {
return function() {
if (num <= 0) return
operation()
return repeat(operation, --num)
}
}
function trampoline(fn) {
while(fn && typeof fn === 'function') {
fn = fn()
}
}
module.exports = function(operation, num) {
trampoline(function() {
return repeat(operation, num)
})
}
具体来说,我对最后一部分感到好奇 - 为什么官方解决方案会创建一个匿名函数,而不仅仅是传递repeat
?
答案 0 :(得分:1)
看看蹦床:
function trampoline(fn) {
while(fn && typeof fn === 'function') {
fn = fn()
}
}
注意只要fn
是一个它调用的函数,它如何继续迭代。
理论上,你可以拥有尽可能多的嵌套函数并获得相同的结果:
module.exports = function(operation, num) {
trampoline(function() {
return function() {
return function() {
return repeat(operation, num);
};
};
});
};
演示:http://jsbin.com/yixaliyoye/1/edit
官方解决方案比您的解决方案还有一个冗余步骤。没有真正的原因,除了原作者可能认为它看起来更具可读性。
答案 1 :(得分:1)
没有什么理由。
除了蹦床将进行所有调用之外,在您的版本中,repeat
的第一次调用是在它之外完成的。这可能被认为更清晰,并且在trampoline
更复杂时可能会产生实际差异(例如,将所有执行包装在try-catch中)。