可以't在chrome控制台中从带名称空间的javascript函数获取返回值

Can't get return value in chrome console from namespaced javascript function

本文关键字:空间 javascript 返回值 获取 函数 控制台 chrome 可以      更新时间:2023-09-26

我想使用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()

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

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

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

附带说明:您的代码似乎依赖于隐式全局变量的恐怖(在第一个版本中,您没有声明playerRowplayers;在第二个版本中不声明FantasyStats)。强烈建议您声明变量。你可以使用严格模式来强化这个习惯。


旁注二:通常我主张人们编写更多函数(例如,取大函数并将其分解为一系列小函数),但在这种情况下,我并不认为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,还有几个缺失的分号,在jQuery(this)之后的.eq(0)从来没有任何用途(根据定义,jQuery(this)创建的jQuery集已经中只有一个元素)。

更进一步,您正在重新设计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/。

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();

我建议第二个。