03-函数作为有返回值的子程序
13.2 函数作为有返回值的子程序
在之前的例子中, printLeapYearStatus 是一个普通意义上的子程序:它只包含了一些便于重用的功能,仅此而已。这种简单的函数用法,平时用的其实不多,当编程问题变得更复杂或更抽象时,用的就更少了。接下来进行一些抽象思考,考虑函数作为有返回值的子程序时的情况。
printLeapYearStatus 固然很不错,但是当进一步构建程序时,很快就不满足于将信息输出到控制台上了。比如,想用HTML或文件作为输出,或者将当前的闰年状态信息用在其他计算中,此时,子程序就爱莫能助了。可是,当需要知道当前年份是否为闰年的时候,我们也不想去重新实现算法。
庆幸的是,重写(和重命名)函数,使之变成一个有返回值的子程序很容易。
function isCurrentYearLeapYear() {
const year = new Date().getFullYear();
if(year % 4 !== 0) return false;
else if(year % 100 != 0) return true;
else if(year % 400 != 0) return false;
else return true;
}
再来看一些例子,它们演示了如何使用新函数的返回值:
const daysInMonth =
[31, isCurrentYearLeapYear() ? 29 : 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31];
if(isCurrentYearLeapYear()) console.log('It is a leap year.');
在继续之前,想想之前给函数起的名字。给一个返回boolean值(或者为在一个具有boolean值的上下文中使用而设计)的函数命名时,将is作为前缀是很常见的做法。该函数名还包含了单词current,这又是为什么呢?因为这个函数的意图很明显,就是获取当前日期。也就是说,在2016.12.31和2017.1.1这两天分别运行函数时,它会有不同的返回值。