无法从命名空间的javascript函数获取chrome控制台中的返回值

时间:2014-10-25 14:16:22

标签: javascript

我希望使用javascript从我的幻想体育团队网站上的表中获取值(并最终总结)。我还希望正确地将其命名为良好的形式和实践。

以下工作代码尝试过滤掉空行,留下我关心的DOM表行数组。

playerRow = jQuery(".pncPlayerRow");
players   = []

var realRows = function(){

  playerRow.each(function(){
    if (jQuery(this).eq(0).children().eq(7).text() != "--"){
      players.push(this);
    } 
  }) 

  return(players);  // returns array of non-empty <tr>
}
realRows();

现在,当我尝试命名这个时,我得到一个未定义的返回值。这是我的代码:

FantasyStats = {}
FantasyStats.collect = function(){
  var playerRow = jQuery(".pncPlayerRow");
  var players   = []
  var realRows = function(){  
    playerRow.each(function(){
      if (jQuery(this).eq(0).children().eq(7).text() != "--"){
        players.push(this);
      } 
    }) 
    return(players);
  }
  realRows();
}
FantasyStats.collect()

我这样做错了吗?有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果您希望FantasyStats.collect返回realRows的返回值,则需要添加return

  // ...
  return realRows(); // <== On this line at the end of `collect`
}
FantasyStats.collect()

附注:您的代码似乎依赖于The Horror of Implicit Globals(在您的第一个版本中,您不会声明playerRowplayers;在您的第二个版本中,您不会#&# 39; t声明FantasyStats)。强烈建议声明您的变量。您可以使用strict mode来强制执行该习惯。


附注二:通常我主张人们编写更多功能(例如,拿大片并将它们分成一系列较小的功能),但在这种情况下,我并不是真的看到realRows函数正在为您做任何事情:

var FantasyStats = {};
FantasyStats.collect = function(){
  var playerRow = jQuery(".pncPlayerRow");
  var players   = [];

  playerRow.each(function(){
    if (jQuery(this).children().eq(7).text() != "--"){
      players.push(this);
    } 
  });
  return players;
};
FantasyStats.collect();

我添加了var,还添加了几个缺失的分号,.eq(0)之后jQuery(this)永远不会有任何目的(根据定义,jQuery集由jQuery(this) 已经只有一个元素。)

进一步说,你重新发明了jQuery的filter功能,你可以使用它来代替:

var FantasyStats = {};
FantasyStats.collect = function(){
  return jQuery(".pncPlayerRow").filter(function(){
    return jQuery(this).children().eq(7).text() != "--");
  }).get();
};
FantasyStats.collect();

(注意最后的.get()将jQuery集转换为普通数组。)

或者这个稍微容易调试的版本:

var FantasyStats = {};
FantasyStats.collect = function(){
  var players = jQuery(".pncPlayerRow").filter(function(){
    return jQuery(this).children().eq(7).text() != "--");
  }).get();
  return players;
};
FantasyStats.collect();

答案 1 :(得分:1)

解决此问题的两种方法:

1 /.

FantasyStats = {}
FantasyStats.collect = function(){
  var playerRow = jQuery(".pncPlayerRow");
  var players   = []
  var realRows = function(){  
    playerRow.each(function(){
      if (jQuery(this).eq(0).children().eq(7).text() != "--"){
        players.push(this);
      } 
    }) 
    return players;
  }
  return realRows(); // return return of realRows => players Array.
}
FantasyStats.collect()

2 /。

FantasyStats = {}
FantasyStats.collect = function(){
  var playerRow = jQuery(".pncPlayerRow");
  var players   = []
  var realRows = function(){  
    playerRow.each(function(){
      if (jQuery(this).eq(0).children().eq(7).text() != "--"){
        players.push(this);
      } 
    }) 
  }
  realRows();
  return players; // return players array after it was filled by realRows function
}
FantasyStats.collect();

我建议第二个。