添加新函数

这里有两种常用的方法,将函数引入到程序中。

首先是你发现自己写了很多次非常相似的代码。 我们最好不要这样做。 拥有更多的代码,意味着更多的错误空间,并且想要了解程序的人阅读更多资料。 所以我们选取重复的功能,为它找到一个好名字,并把它放到一个函数中。

第二种方法是,你发现你需要一些你还没有写的功能,这听起来像是它应该有自己的函数。 您将首先命名该函数,然后您将编写它的主体。 在实际定义函数本身之前,您甚至可能会开始编写使用该函数的代码。

给函数起名的难易程度取决于我们封装的函数的用途是否明确。对此,我们一起来看一个例子。

我们想编写一个打印两个数字的程序,第一个数字是农场中牛的数量,第二个数字是农场中鸡的数量,并在数字后面跟上CowsChickens用以说明,并且在两个数字前填充 0,以使得每个数字总是由三位数字组成。

  1. 007 Cows
  2. 011 Chickens

这需要两个参数的函数 - 牛的数量和鸡的数量。 让我们来编程。

  1. function printFarmInventory(cows, chickens) {
  2. let cowString = String(cows);
  3. while (cowString.length < 3) {
  4. cowString = "0" + cowString;
  5. }
  6. console.log(`${cowString} Cows`);
  7. let chickenString = String(chickens);
  8. while (chickenString.length < 3) {
  9. chickenString = "0" + chickenString;
  10. }
  11. console.log(`${chickenString} Chickens`);
  12. }
  13. printFarmInventory(7, 11);

在字符串表达式后面写.length会给我们这个字符串的长度。 因此,while循环在数字字符串前面加上零,直到它们至少有三个字符的长度。

任务完成! 但就在我们即将向农民发送代码(连同大量发票)时,她打电话告诉我们,她也开始饲养猪,我们是否可以扩展软件来打印猪的数量?

当然没有问题。但是当再次复制粘贴这四行代码的时候,我们停了下来并重新思考。一定还有更好的方案来解决我们的问题。以下是第一种尝试:

  1. function printZeroPaddedWithLabel(number, label) {
  2. let numberString = String(number);
  3. while (numberString.length < 3) {
  4. numberString = "0" + numberString;
  5. }
  6. console.log(`${numberString} ${label}`);
  7. }
  8. function printFarmInventory(cows, chickens, pigs) {
  9. printZeroPaddedWithLabel(cows, "Cows");
  10. printZeroPaddedWithLabel(chickens, "Chickens");
  11. printZeroPaddedWithLabel(pigs, "Pigs");
  12. }
  13. printFarmInventory(7, 11, 3);

这种方法解决了我们的问题!但是printZeroPaddedWithLabel这个函数并不十分恰当。它把三个操作,即打印信息、数字补零和添加标签放到了一个函数中处理。

这一次,我们不再将程序当中重复的代码提取成一个函数,而只是提取其中一项操作。

  1. function zeroPad(number, width) {
  2. let string = String(number);
  3. while (string.length < width) {
  4. string = "0" + string;
  5. }
  6. return string;
  7. }
  8. function printFarmInventory(cows, chickens, pigs) {
  9. console.log(`${zeroPad(cows, 3)} Cows`);
  10. console.log(`${zeroPad(chickens, 3)} Chickens`);
  11. console.log(`${zeroPad(pigs, 3)} Pigs`);
  12. }
  13. printFarmInventory(7, 16, 3);

名为zeroPad的函数具有很好的名称,使读取代码的人更容易弄清它的功能。 而且这样的函数在更多的情况下是有用的,不仅仅是这个特定程序。 例如,您可以使用它来帮助打印精确对齐的数字表格。

我们的函数应该包括多少功能呢?我们可以编写一个非常简单的函数,只支持将数字扩展成 3 字符宽。也可以编写一个复杂通用的数字格式化系统,可以处理分数、负数、小数点对齐和使用不同字符填充等。

一个实用原则是不要故作聪明,除非你确定你会需要它。 为你遇到的每一个功能编写通用“框架”是很诱人的。 控制住那种冲动。 你不会完成任何真正的工作 - 你只会编写你永远不会使用的代码。