2016-11-15 33 views
2

我有一个递归的JavaScript函数问题未定义的递归函数 - 返回值是不确定的:的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. 如果( )声明SaturdayFunc.Sat Dec 23 2017 11:11:53 GMT + 0100 if() Statement Sunday Func.Sun Dec 24 2017 11:11:53 GMT + 0100 if() Statement Holiday Func.Mon Dec 25 2017 11: 11:53 GMT + 0100 if() Statement Holiday Func.Tue Dec 26 2017 11:11:53 GMT + 0100 else 语句 - 值:undefined Func。 - Return:undefined

有人可以帮我解决这个问题吗?

+0

你'next'是不确定的,因为你设置功能下一个变(局部范围)。每次你的函数返回递归(在这种情况下假期)它设置本地'下一个'变量。然后finaly(得到正确的日期),这是没有'下一个'变量定义 - undefined - ...对不起嘴巴 – RizkiDPrast

回答

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>

+0

谢谢你,你是我的英雄!我必须学习很多东西。 – Tobschmi

+0

我很高兴它可以帮助。让我们学习很多:) – RizkiDPrast