• javascript 递归函数调用(recursive funciton call)


    所谓的递归函数调用,就是自己调用自己的函数。

    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 output 3 2 1 0 as above. If I then changed functionHolder as 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).

     
  • 相关阅读:
    数据分析必须掌握的统计学知识!
    数据分析常用指标大全,熟记!
    Java编程基础阶段笔记 day 07 面向对象编程(上)
    Java编程基础阶段笔记 day04 Java基础语法(下)
    Java编程基础阶段笔记 day06 二维数组
    Java编程基础阶段笔记 day05 数组
    Java编程基础阶段笔记 day04 Java基础语法(下)
    Java编程基础阶段笔记 day03 Java基本语法(中)
    啥?虚拟现实技术已经应用到自动化仓库? | 基于unity实现的自动化仓库模拟监控系统
    交互设计书单--西南交大课程推荐
  • 原文地址:https://www.cnblogs.com/oxspirt/p/9341942.html
Copyright © 2020-2023  润新知