“蹦床”方法的区别
Difference between "trampoline" methods
我最近开始学习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
?
其实没有理由。
除了蹦床会发出所有调用,而在您的版本中,repeat
的第一次调用是在它之外完成的。这可能被认为是更干净的,并且当trampoline
更复杂时可能会产生实际差异(例如,将所有执行包装在 try-catch 中)。
看看蹦床:
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
官方解决方案比您的解决方案多了一个冗余步骤。没有真正的原因,除了原作者可能认为它看起来更具可读性。
相关文章:
- XMLHttpRequest对象的open()和send()方法之间有什么区别
- 这两种不同的创建对象文字的方法有什么区别
- MongoDB原生:toString和toHexString方法之间有什么区别吗?
- JavaScript:Date 的 toString() 和 toLocaleString() 方法之间的区别
- 声明Javascript名称空间的两种方法之间的区别
- 在敲除js中,这两种编码方法有什么区别
- 直接调用方法和使用“.call”方法之间的区别?WSS
- isPresent 和 isDisplay方法有什么区别
- 构造函数中的方法和创建构造函数后函数上的方法有什么区别
- 这两种创建元素的方法有什么区别
- Google Maps/Google Places:getPlace 和 getDetails 方法之间有区别吗?
- 按键名调用 JSON 对象的方法有什么区别
- JavaScript 模块化方法中 IIFE 和非 IIFE 之间的区别
- 在构造函数内部和外部定义公共方法之间有什么区别吗?
- 使用无状态功能组件与调用方法有什么区别
- 引导方法和运行方法之间的角度有什么区别
- “蹦床”方法的区别
- 在jQuery选择器中,这些不同的转义方括号的方法有什么区别
- 在Javascript中处理元素和使用Jquery Remove方法删除元素之间有什么区别
- javascript函数声明(这两者的区别.方法和方法?)