1. 基本概念1.1 语句作用
return语句用于终止一个函数的执行,同时将一个返回值返回给这个函数的调用者。因此,return语句必须要被包含在函数之中;否则,程序就会出错。如果没有为return语句指明它的返回值,那么它就默认返回undefined。
如果一个函数中没有显式的写明return语句,那么在函数执行时JavaScript会在该函数执行流程的末尾自动添加一条未指明返回值的return语句。return语句也可以被添加在函数的前面部分,这通常用于当满足某个条件时而提前退出函数。
1.2 语法结构
return语句的语法结构如下所示:
return [expression];
其中expression可以是JavaScript中任意合法的表达式,它的计算结果就是return语句的返回值,在函数终止的时候会被返回给该函数的调用者。如果省略了expression,那么return语句的返回值就默认为undefined。
如果要显式指明expression,那么它和return关键字必须写在同一行上,即它们之间不能有换行符。否则,JavaScript会自动在return关键字的后面添加分号。此时,该return语句其实是一个未指明返回值的return语句,而expression在return语句之后永远都不会被执行到。
2. 示例2.1 指明返回值
// 定义一个函数,计算一个数的两倍
function twice(x) {
var result = x * 2;
return result;
}
// 调用该函数,并打印返回值
var value1 = twice(9);
console.log("value1 = " + value1);
以上代码的执行结果如下图所示。我们用实参9调用函数twice(),它先计算9的两倍然后再返回该结果,随后该返回值被赋值给了变量value1。第10行的代码打印出value1的值,可以看到它的值确实为18。
该示例中的twice()函数还可以简写为下面的形式,即计算两倍的表达式被包含在return语句中,它的结果被直接返回。这样就不需要先声明一个变量临时保存计算结果,再用return语句返回该变量。
// 和上面代码中的twice函数完全等价
function twice(x) {
return x * 2;
}
2.2 省略返回值
// 定义一个函数,它的最后是一条没有指明返回值的return语句
function abc() {
console.log("执行函数abc().");
return;
}
// 调用该函数,并打印返回值
var value2 = abc();
console.log("value2 = " + value2);
从下图的执行结果中我们可以看到,首先打印出了字符串”执行函数abc().”,说明函数abc()确实被执行了。第10行的代码打印出的变量value2的值为undefined,这正是return语句的默认返回值。
2.3 省略return语句
// 定义一个函数,它省略了return语句
function abc() {
console.log("执行函数abc().");
}
// 调用该函数,并打印返回值
var value3 = abc();
console.log("value3 = " + value3);
下图中的执行结果表明,该示例和上一个例子的执行结果完全一致(除了变量被命名为value3之外)。该例子的成功执行表明,当一个函数的执行流程的最后一条语句是没有显式指定返回值的return语句时,该return语句可以被省略。
当一个函数的执行流程的最后缺少return语句的时候,JavaScript会自动在该执行流程的最后添加一条没有返回值的return语句,当然该函数的返回值就为undefined了。
2.4 return语句不能在函数之外
// return 语句在函数之外:这会导致程序出错
return;
console.log("青石野草");
以上代码的执行结果如下图所示,我们可以看到浏览器明确指出第3行的return语句是错误的。
2.5 提前终止函数
return语句不一定非要是函数的最后一条语句,它也可以处于函数的前面或中间,用于提前终止函数的执行。示例代码如下所示:
// 定义一个函数,它计算一个数的相反数;
// 当参数为0时,它会被提前终止
function opposite(x) {
if(x == 0) {
console.log("0的相反数是它自身。");
return 0;
}
console.log("不为0的数的相反数是它的负数。");
return -x;
}
// 调用函数,并打印返回值
var value4 = opposite(0);
console.log("value4 = " + value4);
我们使用实参0调用函数opposite(),当实参为0的时候,会执行if语句中的代码。它首先打印字符串”0的相反数是它自身。”,然后遇到语句return 0;。这条return语句提前终止函数的执行,并返回0。因此,if语句后面的那一条打印语句和return -x;均不会被执行。下图中的执行结果正印证了这一执行流程。
这个例子也说明了一个函数可以包含多个return语句,用于根据不同的情况而退出函数。
2.6 自动添加分号
// 定义一个函数,它和第一个例子中的函数几乎一样;
// 只是原本的return语句被拆分成了两行。
function twice(x) {
var result = x * 2;
return
result;
}
// 调用函数,并打印返回值
var value5 = twice(9);
console.log("value5 = " + value5);
该示例的执行结果如下图所示,可以看到第11行打印出的变量value5的值为undefined,而不是我们原本期望的数字18。这是怎么回事呢?
这个示例和第一个例子唯一的不同就是我们把return语句拆成了两行,return关键字和它的返回值result被写在了不同的行上。在其它编程语言或者JavaScript的某些其它语句中,这样的拆行不会对原程序有任何影响。
但JavaScript的return语句是个例外,在本文的开头我们就说过如果return关键字和它的返回值之间有换行符的话,JavaScript会自动在return关键字之后插入一个分号,此时该return语句的意义就和我们所期望的不同了。
这样自动插入分号的结果就会让该示例中的twice()函数实际等同于下面的代码。此时无论传递的参数是多少,return语句都会提前终止函数并默认返回undefined,而变量result始终都不会被返回。
// 定义一个函数,它和第一个例子中的函数几乎一样;
// 只是原本的return语句被拆分成了两行。
function twice(x) {
var result = x * 2;
return; // 注意,这个分号是JavaScript自动插入的;它改变了程序的语义。
result;
}
如果你真的想要将return语句写在多行上,那么你可以将返回值用括号括起来。但请一定要注意,此时左括号也必须要和return关键字写在同一行上,就像下面的代码这样:
/* 要将return语句写在多行上,可以用括号将返回值括起来;
* 但是,左括号也必须要和return关键字写在同一行上。
*/
function twice(x) {
return (
x * 2
);
}
(完)
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777