JavaScript 允许以递归方式调用函数。

<code class="language-javascript">function countChars(elm) {
if (elm.nodeType == 3) { // 文本节点
return elm.nodeValue.length;
}
var count = 0;
for (var i = 0, child; child = elm.childNodes[i]; i++) {
count += countChars(child);
}
return count;
}

既然匿名函数没有名字,那该怎么递归调用它呢?在这一点上,JavaScript 允许你命名这个函数表达式。你可以命名立即调用的函数表达式(IIFE——Immediately Invoked Function Expression),如下所示:

<code class="language-javascript">var charsInBody = (function counter(elm) {
if (elm.nodeType == 3) { // 文本节点
return elm.nodeValue.length;
}
var count = 0;
for (var i = 0, child; child = elm.childNodes[i]; i++) {
count += counter(child);
}
return count;
})(document.body);
<code class="language-javascript"> /* 求阶乘 */
function fun(n) {
if (n == 1) return 1
return fun(n - 1) * n
i--;
}
console.log(fun(3));

if 语句设置停止条件,在下一行的return语句调用自己