【问题标题】:Javascript: Script dies on Function CallJavascript:脚本在函数调用时终止
【发布时间】:2015-09-09 11:20:35
【问题描述】:

我目前正在 http://eloquentjavascript.net/ 学习 javascript。 我已经养成了在进入下一章进行练习之前完成给定练习的习惯。

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

我刚开始第一个练习题。

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

编写一个范围函数,它有两个参数,开始和结束,并且 返回一个数组,其中包含从开始到(和 包括)结束。

接下来,编写一个 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]。确保它也适用于 负步长值,以便 range(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 行调用

任何指导将不胜感激。 :)

【问题讨论】:

  • line 204 in function tick ...你没想过要发布代码吗?
  • 网站使用沙盒?!?允许您将代码放入代码框中并在此处(在站点上)运行它......我发布的代码是可用框中编写的唯一代码。盒子里没有tick功能
  • 没关系,我看到了问题,i 永远不会改变,所以,无限循环...i + step 应该是i += step
  • 感谢工作。不知道我是怎么错过的-_-'
  • @shaz 也许可以考虑使用while循环,我认为这样会更清晰,更容易忽略。

标签: javascript arrays function


【解决方案1】:

你没有用

增加 i
 (i + step)

应该是

 i += step 
 // or 
 i = i + step
 // is the same

所以,结果是 i 永远不会变大,所以这是一个无限循环.. 浏览器崩溃

【讨论】:

    【解决方案2】:

    您收到此消息的原因是您已成功创建了第一个无限循环!但不要难过,这是一个很常见的问题。您创建的 for 循环永远不会真正结束。这是因为你没有增加“i”,所以它永远不会大于或等于 end。相反,您只是在做一些计算机非常乐意做的数学运算。而不是“+”,您需要“+=”来实际分配“i”本身加上任何“step”。另外,我把你的三元运算符去掉了“end”,因为我根本没有看到它的原因。你之前的代码很好。希望你喜欢 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;
    }
    

    【讨论】:

    • 实际上,end 的三元运算符是必需的,因为范围也可以是相反的顺序,就像引用的问题中所述。添加该位是为了确保它可以在end 小于start 时处理循环迭代。感谢您的输入,但问题已经得到解答。 :)
    • 哈。完全错过了最后一部分。我仍然建议根据 step 是否为负来交换 start 和 end 的值。三元运算符会导致随机无限循环并使 for 循环更难阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多