命名vs无名函数替换字符串中的数字

时间:2016-10-14 12:36:18

标签: javascript

我是一个JavaScript初学者,我得到的最新编程作业中的一个问题是用数字的总和替换字符串中的所有数字,例如,对于这样的输入:

"m123a"

输出应为

"m6a"

我实际上设法编写了一个有效的代码,但我不明白它为什么会起作用。

这是我的HTML:

<html>
  <TEXTAREA ID = "text" ROWS = 10 COLS = 30></TEXTAREA>
  <br>
  <INPUT TYPE = "button" ID = "button" VALUE = "Replace">
  <SCRIPT src = "zaz3.js" type="text/javascript"></SCRIPT>
</html>

这是我正在使用的JavaScript代码:

function ReplaceNumbers()
{
  var s = document.getElementById("text").value;
  document.getElementById("text").value = s.replace(/\d+/g, function DigitSum(x)
  {
    var sum = 0;
    while (x > 0)
    {
      sum += x%10;
      x = x/10;
      x = Math.floor(x);
    }
    return sum;
  });
}

var button = document.getElementById( "button");

button.addEventListener("click" , ReplaceNumbers);

这是我的JavaScript代码的第一个版本,它不起作用:

function DigitSum(x)
{
  var sum = 0;
  while (x > 0)
  {
    sum += x%10;
    x = x/10;
    x = Math.floor(x);
  }
  return sum;
}

function ReplaceNumbers()
{
  var s = document.getElementById("text").value;
  document.getElementById("text").value = s.replace(/\d+/g, DigitSum(x));
}

var button = document.getElementById( "button");

button.addEventListener("click" , ReplaceNumbers);

这里唯一的区别是函数DigitSum在第二个版本中单独实现。

调试第二个代码时,返回的错误是"ReferenceError: x is not defined".我不明白第一个代码中的参数x是如何被解释的,因为它在代码中的任何其他位置都没有提到

所以,我的问题是,单独实现DigitSum功能与在需要它的地方实现它有什么区别,第一个版本中实际是x,第二个版本是什么。

2 个答案:

答案 0 :(得分:1)

因为在第二个中你正在调用函数,而它返回的任何东西都被分配给了replace。在您的情况下,您应该有一个错误,上面写着“x未定义”。

java.lang.Exception: error1
30
20
10

应该只是

document.getElementById("text").value = s.replace(/\d+/g, DigitSum(x));

答案 1 :(得分:1)

您正在使用回调

document.getElementById("text").value = s.replace(/\d+/g, DigitSum(x));
//                                                        ^^^^^^^^^^^

但是只使用函数引用,您插入一个函数调用x,该函数不存在。

将此用作回调的有效参考。

document.getElementById("text").value = s.replace(/\d+/g, DigitSum);
//                                                        ^^^^^^^^ without parenthesis

calback是一个用于重复使用固定参数列表的调用的函数。周围的函数定义参数,在这种情况下,您可以查看String#replace