所谓的递归函数调用,就是自己调用自己的函数。
1 var timerHandler = null; 2 function a(){ 3 console.log(123); 4 timerHandler = setTimeout(a, 1000) ; 5 } 6 a(); 7 //clearTimeout(timerHandler);
-----------------------------------------------------------------------------------------
/* Count down to 0 recursively.
*/
var functionHolder = function (counter) {
console.log(counter);
if (counter > 0) {
functionHolder(counter-1);
}
}
With this, functionHolder(3); would output 3 2 1 0. Let's say I did the following:
var copyFunction = functionHolder;
copyFunction(3);would output3210as above. If I then changedfunctionHolderas follows:
functionHolder = function(whatever) {
console.log("Stop counting!");
}
Then functionHolder(3); would give Stop counting!, as expected.
copyFunction(3); now gives 3 Stop counting! as it refers to functionHolder, not the function (which it itself points to). This could be desirable in some circumstances, but is there a way to write the function so that it calls itself rather than the variable that holds it?
That is, is it possible to change only the line functionHolder(counter-1); so that going through all these steps still gives 3 2 1 0 when we call copyFunction(3);? I tried this(counter-1); but that gives me the error this is not a function.
----------------------------------------------------------------------------------------------
Using Named Function Expressions:
You can give a function expression a name that is actually private and is only visible from inside of the function ifself:
var factorial = function myself (n) { if (n <= 1) { return 1; } return n * myself(n-1); } typeof myself === 'undefined'
Here myself is visible only inside of the function itself.
You can use this private name to call the function recursively.
See 13. Function Definition of the ECMAScript 5 spec:
The Identifier in a FunctionExpression can be referenced from inside the FunctionExpression's FunctionBody to allow the function to call itself recursively. However, unlike in a FunctionDeclaration, the Identifier in a FunctionExpression cannot be referenced from and does not affect the scope enclosing the FunctionExpression.
Please note that Internet Explorer up to version 8 doesn't behave correctly as the name is actually visible in the enclosing variable environment, and it references a duplicate of the actual function (see patrick dw's comment below).
本文探讨了JavaScript中递归函数的概念及应用,通过实例演示了如何使用递归函数实现倒计时,并介绍了如何让函数调用自身而非仅调用变量持有者。
764

被折叠的 条评论
为什么被折叠?



