任何人都可以看到这样编写的递归函数存在问题:
var recurse = 100;
var recursed = 0;
(function (callback){
callback(callback);
})(function(callback){
recursed++;
console.log('recursed ' + recursed + ' times');
if(recursed < recurse){
callback(callback);
}
});
为什么这可能会执行得更慢?或者可能被认为是不好的做法?
这个函数式编程是不是已经破坏了?
答案 0 :(得分:3)
函数式编程的核心原则是数据不变性,函数是数学意义上的函数(即取值和返回值而没有任何副作用)。这些原则形成参照透明度,即给定相同的参数,函数将始终返回相同的结果。
您的功能不满足任何被称为“功能”的标准。
以下是如何以函数样式完成递归的示例:
var recursiveFunction = function( count, max ) {
if( count < max ){
return recursiveFunction( count + 1, max )
} else {
return count
}
}
var result = recursiveFunction(0, 100) // result == 99
答案 1 :(得分:2)
为什么这可能会执行得更慢?
是。 JavaScript几乎没有尾调用优化。循环会更快。
或者可能被认为是不好的做法?
是。您的示例代码无法读取,很难掌握所有这些callback
的功能。
如果你想对这样的事情使用递归,那么IENFE(Named&amp; Immediately Executed Function Expression)将是更好的选择:
(function callback(recursed) {
console.log('recursed ' + recursed + ' times');
if (recursed < 100)
callback(recursed + 1);
})(0);