函数体被大括号包裹,是这个函数被调用的时候具体要执行的语句。一个函数的函数体内语句可多可少。
比如,我们定义一个计算两个参数和的函数,它只有 1 条语句:
function sum(a , b){
console.log(a + b);
}
函数被定义之后,并不代表着函数体的语句会立即执行。函数必须被调用,函数体内的语句才能执行。换句
话说,如果一个函数永远不被调用,其内部的语句就白写了。
调用函数
调用函数非常的简单,只需要书写函数的名字然后加上圆括号即可,圆括号内要写上需要传入的参数。一般
的,函数调用时传入的参数个数应该和函数定义时声明的参数一样多。比如:
fun(3,5)
此时函数被调用,数字 3、5 将分别传给函数的 a、b 两个参数,函数体内的语句被执行,程序计算了 3 和 5
的和,控制台输出了正确的结果
定义函数的时候,参数 a、b 是两个普通的变量,它们被成为“形式参数”,顾名思义,它们就是一个符号、
代号,具体表示多少值是不确定的;而调用函数的时候传入的数值,我们称为“实际参数”,它们将依次给形式
参数进行赋值,称为“形实结合”
函数的返回值
上小节值我们定义了一个函数,这个函数没有任何的返回值,即没有 return 语句:
function fun(a , b){
console.log(a + b);
}
这个函数体内已经书写了输出语句,我们在调用这个函数的时候就不用书写输出语句了。比如:
fun(3,4); //控制台中输出 7
函数中可以书写 return 关键字表示自己的返回值。一个书写了 return 的函数,在调用的时候将可以被当
做值使用。例如,我们更改这个函数为:
function sum(a , b){
return a + b;
}
var result = sum(3 , 4);
console.log(result); //7
函数 sum 的 return 语句表示“返回”,函数会将参数 a 和 b 的和返回。这样一来,调用函数的语句 sum(3,4)
此时就要被看做是一个“值”。也就是说,sum(3,4)此时就是数值 7,从而可以被赋值给变量 result,我们需
要书写语句 console.log()将这个值输出。
虽然函数不一定必须有返回值,但保证任何一个函数都有返回值是非常好的习惯。函数像一个加工厂,给它
一个或多个不同的原料,它能生产出一个产品。这个比喻中的原料就是参数,产品就是返回值
函数体内,遇见一个 return 语句,就将立即返回它,并且函数将立即停止继续执行,将程序控制权返回给
调用者。我们用案例来讲解这个知识点。
编写一个函数 isEven(n),检查 n 是不是偶数。如果是偶数则返回 true,不是则返回 false。
程序当然可以这么写:
function isEven(n){
if(n % 2 == 0){
return true;
}else{
return false;
}
}
实际上它可以简化为:
function isEven(n){
if(n % 2 == 0){
return true;
}
return false;
}
我们省去了 else 语句,因为当 n 是偶数的时候,就会执行 return true 语句,此时函数将立即结束执行,
if 语句后面的语句也就执行不到了。如果 n 是奇数,则不进入 if 语句,从而执行 return false 了。
当然,最简单的 isEvent 函数的写法是这样:
function isEven(n){
return n % 2 == 0;
}
这个函数接受一个参数 n,返回了 n % 2 == 0 的运算结果,很明显,如果 n 是偶数将返回 true;如果 n
是奇数,将返回 false。这个函数写的非常精简,比前两种写法都更优雅。
注意到这个函数的名字叫 isEven,even 是偶数的意思,而程序员都习惯将返回布尔值的函数以 is 前缀或
check 前缀命名。
用 chrome 浏览器打开网页,在控制台 REPL 环境可以调用这个函数,这是一个非常好的测试函数的方法
前文说过,当函数有 return 值的时候,这个函数的调用语句即可被看做是一个值,而 isEven 函数现在就
是一个布尔值。所以 isEven()可以写在 if 语句的条件中。比如,我们可以利用这个函数输出 1~100 以内的所
有偶数:
function isEven(n){
return n % 2 == 0;
}
for(var i = 1 ; i <= 100 ; i++){
if(isEven(i)){
console.log(i);
}
}
注意这里的写法,因为 isEven(i)已经是一个布尔值了,已经可以当做 if 语句的判断条件了,所以不用画
蛇添足书写 isEven(i)==true。
这个程序的算法思路是遍历 1~100 共 100 个数字,分别让这些数字成为函数的参数来调用函数。如果函数
的返回值是 true,则输出数字 i。
你可能会认为,想输出 1~100 的所有偶数没有必要封装为函数,完全可以直接在 for 循环中验证 i % 2 ==
0 的真假性即可。你的想法是正确的,但是当业务比较复杂的时候,使用函数可以简化我们的思维层级。