的 递归 强>
我常常看到函数重复调用时使用的术语“递归”,虽然JavaScript中“递归”的明确定义是什么?
这个定义看起来很好,但是函数不必直接调用它自己是递归的,它的执行只需要再次调用它。函数不直接调用自身的递归示例是:调用 A(); 电话 B(); 哪个叫 C(); 哪个叫 A(); 再次。
A();
B();
C();
的 重复调度 强>
像这样的函数使用重复调度:
function A ( foo ) { var bar; setTimeout( A, 0 ); console.log( 'hello' ); }
它不是递归的,因为A不会在同一个调用堆栈上重复调用。当完成当前调用堆栈(这意味着'hello'将被记录)并且在事件循环中再没有其他任何事情再次调用A时,将调用A.除了同步和异步代码之间的区别,这里重要的不同之处在于只有一个副本 foo 和 bar 一次,调用堆栈没有增长,因此没有内存或最大调用堆栈大小超出错误,这个版本将使用递归:
foo
bar
function A ( foo ) { var bar; A(); console.log( 'hello' ); }
在那种情况下,'hello'永远不会打印出来 A 在到达logging语句之前调用它自己。
A
的 一种引用自身的非终止程序 强>
非终止过程只是一个无限循环。提到自己有点无意义:
function A ( ) { // Never terminates while ( true ) { // If A() is called here, or before // the loop you have infinite // recursion and a stack size error } // If, instead, A() is called here, // you just have an infinite-loop, // since this statement is never reached }