Javascript 区别于;蹦床“;方法
我最近开始学习JS,这是我第一次涉足函数式语言领域 在Javascript 区别于;蹦床“;方法,javascript,node.js,trampolines,Javascript,Node.js,Trampolines,我最近开始学习JS,这是我第一次涉足函数式语言领域 在functional javascript workshopnpm模块中进行“蹦床”练习,在我自己的解决方案和官方解决方案之间发现了一个有趣的差异。两者都很好,但我不知道它们之间的实际区别到底是什么。我非常理解自己的解决方案,但不完全理解为什么另一个也能起作用 我的解决方案 function repeat(op, num) { var _repeat = function() { if (num <= 0) return;
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)
})
}
函数重复(op,num){
var_repeat=函数(){
如果(num看一下蹦床:
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);
};
};
});
};
演示:
官方解决方案比您的解决方案多了一个多余的步骤。没有真正的理由,除了原作者可能认为它看起来更可读。没有真正的理由
除了蹦床可能会进行所有调用之外,而在您的版本中,repeat
的第一次调用是在它之外进行的。这可能被认为更干净,并且当蹦床
更复杂时(例如,将所有执行包装在一个try-catch中),可能会产生实际的影响.我认为代码没有任何区别,我注意到的唯一一点是,在正式解决方案中,您可以立即知道使用函数调用trampoline,在您的解决方案中,必须检查返回的内容。另外,请注意,使用正式解决方案时要小心,避免javascript中出现分号如果你不知道这在“引擎盖下”是有效的。嘿,乔尔,我有个问题要问你。我挂断了这个练习。我看不出“fn&&typeof fn==”function”何时或是否会是真的。有点困惑。