Javascript返回未定义的递归函数与Date()

时间:2016-11-15 12:13:19

标签: javascript jquery

我遇到了递归javascript函数的问题 - 返回值未定义:

function get_next_weekday(timesec) {

    var nextdaytogo = timesec;
    var nextday;
    var hour = timesec.getHours();
    initstunden = 13 - hour;
    initminuten = 59 - timesec.getMinutes();
    var holidays = [
        new Date(2016, 11, 25).toDateString(), new Date(2016, 11, 26).toDateString(), new Date(2017, 00, 01).toDateString(), new Date(2017, 00, 06).toDateString(), 
        new Date(2017, 03, 14).toDateString(), new Date(2017, 03, 17).toDateString(), new Date(2017, 04, 01).toDateString(), new Date(2017, 04, 25).toDateString(), 
        new Date(2017, 05, 05).toDateString(), new Date(2017, 05, 15).toDateString(), new Date(2017, 09, 03).toDateString(), new Date(2017, 10, 01).toDateString(), 
        new Date(2017, 11, 25).toDateString(), new Date(2017, 11, 26).toDateString(), new Date(2018, 00, 01).toDateString(), new Date(2018, 00, 06).toDateString(), 
        new Date(2018, 02, 30).toDateString(), new Date(2018, 03, 02).toDateString(), new Date(2018, 04, 01).toDateString(), new Date(2018, 04, 10).toDateString(), 
        new Date(2018, 04, 21).toDateString(), new Date(2018, 04, 31).toDateString(), new Date(2018, 09, 03).toDateString(), new Date(2018, 10, 01).toDateString(), 
        new Date(2018, 11, 25).toDateString(), new Date(2018, 11, 26).toDateString()
    ];


    if ( $.inArray(timesec.toDateString(), holidays) > -1 || timesec.getDay() == 0 || timesec.getDay() == 6) {
        console.log("if() Statement")
        //Holiday
        if ( $.inArray(timesec.toDateString(), holidays) > -1){
            console.log("Holiday Func." + timesec);
            var nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
            var next = get_next_weekday(nextday);

        }
        //Sunday
        else if (timesec.getDay() == 0){
            console.log("Sunday Func." + timesec);
            var nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
            var next = get_next_weekday(nextday);

        }
        //Saturday
        else if (timesec.getDay() == 6){
            console.log("Saturday Func." + timesec);
            var nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
            var next = get_next_weekday(nextday);

        }
        else console.log("Und. Func.");


    }
    else{
        console.log("else Statement - Value: " + next);
        return timesec;
    }
}

var daydeliver = get_next_weekday(aktuell);
console.log("Func. - Return: " + daydeliver);

这是日志:

  1. if()Statement SaturdayFunc.Sat Dec 23 2017 11:11:53 GMT + 0100 if() 声明周日Func.Sun 12月24日2017 11:11:53 GMT + 0100 if() 声明Holiday Func.Mon 12月25日2017 11:11:53 GMT + 0100 if() 声明Holiday Func.Tue Dec 26 2017 11:11:53 GMT + 0100 else 声明 - 值:undefined Func。 - 返回:未定义
  2. 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这是因为你在本地范围内声明var +在递归fn触发时你什么都不返回。我想你希望next保持递归fn的前一个日期。请查看以下内容:

//next will return undefined if no recursive function called
var next;
function get_next_weekday(timesec) {

    var nextdaytogo = timesec;
    var nextday;
    var hour = timesec.getHours();
    initstunden = 13 - hour;
    initminuten = 59 - timesec.getMinutes();
    var holidays = [
        new Date(2016, 11, 25).toDateString(), new Date(2016, 11, 26).toDateString(), new Date(2017, 00, 01).toDateString(), new Date(2017, 00, 06).toDateString(), 
        new Date(2017, 03, 14).toDateString(), new Date(2017, 03, 17).toDateString(), new Date(2017, 04, 01).toDateString(), new Date(2017, 04, 25).toDateString(), 
        new Date(2017, 05, 05).toDateString(), new Date(2017, 05, 15).toDateString(), new Date(2017, 09, 03).toDateString(), new Date(2017, 10, 01).toDateString(), 
        new Date(2017, 11, 25).toDateString(), new Date(2017, 11, 26).toDateString(), new Date(2018, 00, 01).toDateString(), new Date(2018, 00, 06).toDateString(), 
        new Date(2018, 02, 30).toDateString(), new Date(2018, 03, 02).toDateString(), new Date(2018, 04, 01).toDateString(), new Date(2018, 04, 10).toDateString(), 
        new Date(2018, 04, 21).toDateString(), new Date(2018, 04, 31).toDateString(), new Date(2018, 09, 03).toDateString(), new Date(2018, 10, 01).toDateString(), 
        new Date(2018, 11, 25).toDateString(), new Date(2018, 11, 26).toDateString()
    ];


    if ( $.inArray(timesec.toDateString(), holidays) > -1 || timesec.getDay() == 0 || timesec.getDay() == 6) {
        console.log("if() Statement")
        //Holiday
        if ( $.inArray(timesec.toDateString(), holidays) > -1){
            console.log("Holiday Func." + timesec);
            let nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
             next = timesec;
             return get_next_weekday(nextday);

        }
        //Sunday
        else if (timesec.getDay() == 0){
            console.log("Sunday Func." + timesec);
            let nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
            next = timesec;
          return get_next_weekday(nextday);

        }
        //Saturday
        else if (timesec.getDay() == 6){
            console.log("Saturday Func." + timesec);
            let nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
            next = timesec;
          return get_next_weekday(nextday);

        }
        else {console.log("Und. Func.");
            next = "Und. Func.";return;
            }
    }
    else{
        console.log("else Statement - Value: " + next);
        return timesec;
    }    
}

var daydeliver = get_next_weekday(new Date(2016, 11, 11));
console.log("Func. - Return: " + daydeliver);
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js"></script>