【问题标题】:Functions and arrays in for loop creating errorfor循环中的函数和数组创建错误
【发布时间】:2013-10-04 06:30:01
【问题描述】:

我正在使用一个名为 moment.js 的 JS 库来查找和消除在 start_time 和 stop_time 之间存在很大差距的事件。我一直收到这个错误——

TypeError: moment(...) 为空 var stopmoment1 = moment(data.events.event[x].stop_time).format("YYYY");

啊!!!

for (var x = 0; x

var position = new google.maps.LatLng(
  data.events.event[x]['latitude'],
  data.events.event[x]['longitude']);

// 控制台返回年份

console.log(moment(data.events.event[x].start_time).format("YYYY"));

// 但这里说 moment 返回 null

var startmoment1 = 时刻(data.events.event[x].start_time).format("YYYY"); var startmoment2 = moment(data.events.event[x].start_time).format("MM"); var startmoment3 = moment(data.events.event[x].start_time).format("DD");

var startmoment = moment([startmoment1,startmoment2,startmoment3]);

var stopmoment1 = moment(data.events.event[x].stop_time).format("YYYY"); var stopmoment2 = moment(data.events.event[x].stop_time).format("MM"); var stopmoment3 = moment(data.events.event[x].stop_time).format("DD");

var stopmoment = moment([stopmoment1,stopmoment2,stopmoment3]);

if (startmoment.diff(stopmoment, 'days') > 7) { } else{

if (moment().format("YYYYMMDD") == moment(data.events.event[x].start_time).format("YYYYMMDD")) {

  marker.push(new google.maps.Marker({
    position: position,
    map: map,
    icon: image
  }));

  marker[x].x = x;//make the marker aware of its own index

  google.maps.event.addListener(marker[x], 'click', function() {
    var div = document.createElement('div');
    div.setAttribute("id", "tabs-min");
    div.innerHTML = content[this.x];
    $(div).tabs();
    infowindow.setContent(div); 
    infowindow.open(map, this);
  });


} else {
  marker.push(new google.maps.Marker({
    position: position,
    map: map,
    icon: image1
  }));

  marker[x].x = x;//make the marker aware of its own index

  google.maps.event.addListener(marker[x], 'click', function() {
    var div = document.createElement('div');
    div.setAttribute("id", "tabs-min");
    div.innerHTML = content[this.x];
    $(div).tabs();
    infowindow.setContent(div); 
    infowindow.open(map, this);
  });   }

【问题讨论】:

  • 对不起,我可能误解了,var stopmoment1 = moment(data.events.event[x].stop_time).format("YYYY"); 行给你一个错误,它不在循环内设置的事件处理函数中?正如 Kristof 建议的那样,也许 console.log 一些东西。在 Firefox 中,您可以按 control+shift+k,在 Chrome 中,按 F12 打开控制台(IE 有控制台,但在 90% 的情况下会记录 [object Ojbect])然后您可以开始记录一些内容,例如 console.log("moment is:", moment)console.log("stop time is:",data.events.event[x].stop_time)
  • 我已经更新了我的答案,尝试在全局范围内添加 eventListeners 变量并将其替换为我发布的代码。每次重新声明事件侦听器都会重复您的代码(复制粘贴),而不是最好重新使用现有函数。通过这种方式,您可以限制闭包可用的变量数量。它有一些 console.log 语句,可以给你一个关于发生了什么的提示。
  • 为什么会有这个:for (var x = 0; x < data.page_size; x++) { 为什么没有这个:for (var x = 0; x < data.event.length; x++) {
  • 我想我当时不知道 .length 属性。 page_size 是 json 响应的一部分,相当于长度,所以我选择了那个

标签: javascript arrays for-loop momentjs


【解决方案1】:

发出警报或 console.writeline 或调试它以找出 data.events.event[x].stop_time 的值。
您可能将 undefined 或空字符串传递给导致异常的时刻函数。

【讨论】:

    【解决方案2】:

    啊,closures in loops,你能看出下面2个代码sn-ps的区别吗?

    for(i=0;i<10;i++){
      setTimeout(function(){
        console.log(i);//logs 10 every time
      },10);
    }
    

    还有正确的

    for(i=0;i<10;i++){
      setTimeout((function(i){
        return function(){
          console.log(i);//logs 0,1,2,3,4...
        };
      }(i)),10);
    }
    

    [更新]

    我已重新格式化您的代码,删除重复代码,添加日志,甚至将侦听器移动到单独的对象中,以便您可以调用它并传递关闭所需的变量,而不会在其中捕获可能的大变量,并拥有更强大的事件处理程序附件循环内:

    var eventListeners={
      markerClick:function(myContent){
          return function(e) {
            var div = document.createElement('div');
            div.setAttribute("id", "tabs-min");
            div.innerHTML = myContent;
            $(div).tabs();
            infowindow.setContent(div);
            infowindow.open(map, this);
          };
        }
    };
    
    for (var x = 0; x < data.event.length; x++) {
      var position = new google.maps.LatLng(
              data.events.event[x]['latitude'],
              data.events.event[x]['longitude']);
    
      console.log("moment is:",moment);
      console.log("data.events is:", data.events);
      console.log("x is:",x);
      console.log("event at x is:",data.events.event[x]);
      console.log("start time is:",data.events.event[x].start_time);
      var startmoment1 = moment(data.events.event[x].start_time).format("YYYY");
      var startmoment2 = moment(data.events.event[x].start_time).format("MM");
      var startmoment3 = moment(data.events.event[x].start_time).format("DD");
      var startmoment = moment([startmoment1, startmoment2, startmoment3]);
    
      var stopmoment1 = moment(data.events.event[x].stop_time).format("YYYY");
      var stopmoment2 = moment(data.events.event[x].stop_time).format("MM");
      var stopmoment3 = moment(data.events.event[x].stop_time).format("DD");
      var stopmoment = moment([stopmoment1, stopmoment2, stopmoment3]);
    
      if (!(startmoment.diff(stopmoment, 'days') > 7)) {
        marker.push(new google.maps.Marker({
          position: position,
          map: map,
      //no need for the if statement, only thing different is the image
      //but you are repating a lot of other code like adding and defining the handler
          icon: (moment().format("YYYYMMDD") ===
                  moment(data.events.event[x].start_time).format("YYYYMMDD")) ?
                  image : image1
        }));
        google.maps.event.addListener(marker[x], 'click', 
          eventListeners.markerClick(content[x]));
      }
    }
    

    【讨论】:

    • 哇,谢谢!我明白现在发生了什么。当 x=3 时,事件停止时间为 null,会触发 moment 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2022-01-08
    • 2022-01-13
    相关资源
    最近更新 更多