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。

return键在哪_return_returnto

该示例中的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语句的默认返回值。

returnto_return键在哪_return

2.3 省略return语句


    // 定义一个函数,它省略了return语句
    function abc() {
        console.log("执行函数abc().");
    }
    // 调用该函数,并打印返回值
    var value3 = abc();
    console.log("value3 = " + value3);

下图中的执行结果表明,该示例和上一个例子的执行结果完全一致(除了变量被命名为value3之外)。该例子的成功执行表明,当一个函数的执行流程的最后一条语句是没有显式指定返回值的return语句时,该return语句可以被省略。

return_returnto_return键在哪

当一个函数的执行流程的最后缺少return语句的时候,JavaScript会自动在该执行流程的最后添加一条没有返回值的return语句,当然该函数的返回值就为undefined了。

2.4 return语句不能在函数之外


    // return 语句在函数之外:这会导致程序出错
    return;
    console.log("青石野草");

以上代码的执行结果如下图所示,我们可以看到浏览器明确指出第3行的return语句是错误的。

returnto_return键在哪_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_returnto_return键在哪

这个例子也说明了一个函数可以包含多个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。这是怎么回事呢?

returnto_return键在哪_return

这个示例和第一个例子唯一的不同就是我们把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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注