【问题标题】:Javascript undefined array in function函数中的Javascript未定义数组
【发布时间】:2015-03-03 21:40:08
【问题描述】:

我编写了一个函数,它采用plevel(整数)和slevel(数字字符串数组)并找到plevelslevel 中的值之间的最小差异。但是,当我运行脚本时,它没有响应,并且调试器说 diff 未定义。

var findDiff = function findDiff(plevel, slevel) {
  var diff = new Array();

  for (i=0; i<=slevel.length; i++) {
    sleveli = parseInt(slevel[i]);
    diff.push(Math.abs(plevel-sleveli));
  }

  if (diff.length > 1){
    diff.sort(function(a, b){return a-b});
    return diff[0]
  }
  else{
    return diff[0];  
  }
}

函数在这里被调用:

var matches = new Array();
var newFetch = Data.find().fetch();
for(i = 0; i <= newFetch.length; i++ ){
    pointsMatch = 0
    var difference = findDiff(newFetch[i].level, spec.level);
    pointsMatch -= (difference*3);
    matches.push([newFetch[i], pointsMatch])
}
console.log(matches)

Data 是一个 mongoDB 集合。 spec.level 是一个数字字符串数组,作为属性存储在对象中。

【问题讨论】:

  • 你能举个例子来说明你是如何调用这个函数的吗?
  • 顺便说一句,这个索引不是超出范围吗? i&lt;=slevel.length
  • @OmriAharon parseInt(string) 如果字符串是有效的数字字符串,则不会返回 NaN
  • @Omri Aharon 如果您所做的只是像他在这里所做的那样称呼它,那么没有任何好处。但这是编码风格的问题。 OP 显然认为最好的做法是命名所有函数并将它们分配给变量,这样您就不需要跟踪何时执行以及何时不执行。不是每个人都同意,但这可能永远不会达成普遍共识,就像是否要评论而不是在单元测试中记录所有内容一样。
  • 还记得变量提升...var foo = function foo() 是一个命名函数表达式,而 function foo 是一个函数语句。后者被吊起,前者没有。一个 Duff 是正确的,命名函数表达式与匿名函数表达式相比对调试很有用。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript arrays function


【解决方案1】:

我想指出命名空间污染,这可能会造成严重的麻烦。据我了解,您有两种命名空间污染的情况,其中一种造成了无限循环。

您实际上有一个内部和外部循环,由一个函数分隔。你的外部 for 循环:

for(i = 0; i <= newFetch.length; i++ ){
    pointsMatch = 0
    ...

然后是你的内部 for 循环:

for (i=0; i<=slevel.length; i++) {
  sleveli = parseInt(slevel[i]);
  ...

由于i之前缺少var,所以两个for循环的定义其实都是这样的:

for (window.i=0; ...

所以内部循环覆盖了变量i,外部循环依赖于终止。 i 是“污染”命名空间。

第二种情况是无害的:

sleveli = parseInt(slevel[i]);

由于缺少var,这实际上导致了

window.sleveli = parseInt(slevel[i]);

会更好

var sleveli = parseInt(slevel[i]);

但这是一个定时炸弹。

我建议您在 for 循环中将 var 添加到 i 的定义中。

【讨论】:

    【解决方案2】:

    我认为 cmets 的人是对的;我们需要查看更多您的输入才能正确调试。但是您可以通过随时跟踪分钟数来大大简化您的代码:

    var findDiff = function findDiff(plevel, slevel) {
      var min = Number.MAX_SAFE_INTEGER;
      for (i=0; i<slevel.length; i++) {
        sleveli = parseInt(slevel[i]);
        var diff = Math.abs(plevel-sleveli);
        min = Math.min(min, diff)
      }
      return min;
    }
    
    var a = ["1", "2", "10", "17"]
    var p = 6
    
    // We're expecting 4 as the min diff
    console.log(findDiff(p, a))
    // ...prints out 4 :-)
    

    http://repl.it/ceX

    正如 Omri 指出的那样,在 for 循环中使用 &lt; 而不是 &lt;=

    注意 - 号码并不总是可用 - 请参阅此处:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER

    您也可以将初始最小值设置为适合您可能数据的大小,例如 2^10

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2012-07-04
      • 2011-09-25
      • 2011-05-21
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多