实例一、创建具有唯一Id的Dom元素
+function(){
function getUniqueEleId(){
var uid='uid'+parseInt(Math.random()*10000);
if(document.getElementById(uid)){
//遇到相同ID的元素就重新执行函数自身(尾递归)。
return arguments.callee();//或者return getUniqueEleId();
}else{
return uid;
}
}
var uid = getUniqueEleId();
var div = document.createElement('div');
div.id = div.innerHTML = uid;
div.onclick = function(){
console.log(this.id);
};
document.body.appendChild(div);
}();
实例二、计算自然数n~m之和
function S(n, m){
if(m==n) return n;
else return m + arguments.callee(n, m-1);
}
console.log(S(2,6));//2+3+4+5+6=20
尾递归有时候很方便,但是也会带来性能上的问题。如果调用方式是线性的,那么性能上可能问题不大;如果调用方式是指数增长的,就要避免使用了,比如下面求斐波那契数列的例子:
function fibonacci(n) {
return (function(n) {
if (n == 1 || n == 2)
return 1;
return arguments.callee(n - 1) + arguments.callee(n - 2); //同时调用自身两次,数量级呈指数增长。
})(n);
}