Javascript:脚本在函数调用上死亡

时间:2015-09-09 11:20:35

标签: javascript arrays function

我目前正在从 http://eloquentjavascript.net/ 学习javascript。 我已经养成了经历给定练习的习惯,然后再进入下一章进行练习。

所以我刚读完第4章,并正在完成本章末尾的练习。 链接: http://eloquentjavascript.net/04_data.html

我刚开始第一个运动问题。

我已成功完成第一个练习题的前两部分:

  

编写一个带有两个参数的范围函数,start和end,和   返回一个数组,其中包含从开始到(和。)的所有数字   包括)结束。

     

接下来,编写一个sum函数,它接受一组数字并返回   这些数字的总和。运行上一个程序,看看是否   确实会回归55。

使用以下代码:

// Your code here.
function range(start, end)
{
  var rangearray = new Array();
  for(  var i = start ; (i <= end + 1)  ;   i++)
    rangearray.push(i);
  return rangearray;
}

function sum(numarray)
{
  var result = 0;
  //var numb = 0;
  for(numb in numarray)
    result += parseInt(numb);
  return result;
}


console.log(sum(range(1, 10)));
// → 55  (this is supposed to be the output, and I get this without any problem)

然而,同样的练习还有一个额外的任务,这看起来相当简单,但我却惨遭失败:

  

作为奖励分配,修改您的范围功能以选择   第三个参数,表示用于构建的“步骤”值   阵列。如果没有给出步骤,则数组元素按增量递增   一,对应旧的行为。函数调用范围(1,10,   2)应该返回[1,3,5,7,9]。确保它也适用   负步长值使范围(5,2,-1)产生[5,4,3,2]。

以下是我正在使用的代码:

// Your code here.
function range(start, end, step)
{
  var rangearray = new Array();
  end = (end < start) ? end - 1: end + 1;
  step = (typeof step === 'undefined') ? 1 : parseInt(step);
  var i = 0;
  for(  i = start ; ((step < 0) ? (i >= end) : (i <= end)) ; (i + step) )
  {rangearray.push(i);}
  return rangearray;
}

function sum(numarray)
{
  var result = 0;
  //var numb = 0;
  for(numb in numarray)
    result += parseInt(numb);
  return result;
}

console.log(range(5, 2, -1));


// → [5, 4, 3, 2]    (this is supposed to be the output)

当代码运行时,我收到一条警告消息,说明代码已运行超过2秒,并询问是否应该中止代码。 10秒后发生同样的事情。在中止时,收到以下错误:

  

错误:已中止(功能勾选中的第204行)

     

从功能范围的第9行调用

     

从第25行调用

非常感谢任何指导。 :)

1 个答案:

答案 0 :(得分:0)

您收到此消息的原因是您已成功创建了第一个无限循环!但是不要心疼,这是一个非常普遍的问题。你创建的for循环实际上永远不会结束。这是因为你没有递增“i”所以它永远不会变得大于或等于结束。相反,你只是在做一些计算机非常乐意做的数学计算。而不是“+”,你需要“+ =”来实际分配“i”本身加上“步骤”。另外,我拿出你的三元运算符“结束”,因为我根本没有看到它的原因。你之前的代码很好。我希望你喜欢JavaScript!

最后一个建议是永远不要将三元运算符置于for循环中。

// Your code here.
function range(start, end, step)
{
    var rangearray = new Array();
    step = (typeof step === 'undefined') ?     
                           1 : parseInt(step);
    var i = 0;
    for(  i = start; i <= end ; (i += step) )
        {rangearray.push(i);}
    return rangearray;
}