当前位置:嗨网首页>书籍在线阅读

02-函数作为子程序

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

13.1 函数作为子程序

子程序是一个非常老的概念,实际上,它是为了管理日趋复杂的程序而做出的让步。的确,如果没有子程序,编程将是一件不断重复的枯燥事情。子程序将一些重复的功能进行简单地封装,并赋予它一个名字,接下来,就可以在任何时候通过引用名字来执行那些功能。

子程序有很多别名,诸如:过程、例行程序、次程序、宏,以及可调用单元这个无比平淡的名字。事实上,在JavaScript中,并不用子程序这个名字,就把函数就叫作函数(或者方法)。这里使用术语子程序,是为了强调这种函数用法。

通常,子程序用来封装某个算法,该算法只是一个可被理解的执行单元,用来执行给定任务。下面看一个计算当前年份是否是闰年的算法:

const year = new Date().getFullYear();
if(year % 4 !== 0) console.log('${year} is NOT a leap year.')
else if(year % 100 != 0) console.log('${year} IS a leap year.')
else if(year % 400 != 0) console.log('${year} is NOT a leap year.')
else console.log('{$year} IS a leap year');

设想一下,如果要在程序中执行10次这段代码,更有甚者,可能会执行100次。这时如果要修改打印在console中的信息,就必须找到所有使用该代码的实例,然后修改这4个输出字符串!这个噩梦可以很方便地通过子程序解决。在JavaScript中,函数就可以满足这个需求:

function printLeapYearStatus() {
   const year = new Date().getFullYear();
   if(year % 4 !== 0) console.log('${year} is NOT a leap year.')
   else if(year % 100 != 0) console.log('${year} IS a leap year.')
   else if(year % 400 != 0) console.log('${year} is NOT a leap year.')
   else console.log('{$year} IS a leap year');
}

上述代码创建了一个名为 printLeapYearStatus 的可复用子程序(函数)。这个大家应该已经很熟悉了。

注意为函数选的名字: printLeapYearStatus 。为什么不给它命名为 getLeapYearStatusleapYearStatusleapYear 呢?虽然这些名字更简短,但它们忽略了一个重要的细节:这个函数只是打印了当前日期是否为闰年这一状态,没有做别的事情。有意义地命名函数可以说是一门科学,或者说是一门艺术。因为名字不是给JavaScript看的,它并不关心命名。名字是给其他人看的(或者是将来的自己)。在命名函数时,需要仔细想想如何做到让他人在看函数名的时候就能明白函数的意图。理想情况下,当然希望名字本身就能准确地表达函数的意图。而另一方面,函数名也可能会因此变得过于冗长。例如,可以给这个函数命名为 calculateCurrentLeapYearStatusAndPrintToConsole ,但这会因为名字过长而得不偿失。此时,命名的艺术性就体现出来了。