JavaScript return語句

1. 基本概念

1.1 語句作用

return語句用於終止一個函數的執行,同時將一個返回值返回給這個函數的調用者。因此,return語句必須要被包含在函數之中;否則,程序就會出錯。如果沒有為return語句指明它的返回值,那麼它就默認返回undefined。

如果一個函數中沒有顯式的寫明return語句,那麼在函數執行時JavaScript會在該函數執行流程的末尾自動添加一條未指明返回值的return語句。return語句也可以被添加在函數的前面部分,這通常用於當滿足某個條件時而提前退出函數。

1.2 語法結構

return語句的語法結構如下所示:

<code>return [expression];/<code>

其中expression可以是JavaScript中任意合法的表達式,它的計算結果就是return語句的返回值,在函數終止的時候會被返回給該函數的調用者。如果省略了expression,那麼return語句的返回值就默認為undefined。

如果要顯式指明expression,那麼它和return關鍵字必須寫在同一行上,即它們之間不能有換行符。否則,JavaScript會自動在return關鍵字的後面添加分號。此時,該return語句其實是一個未指明返回值的return語句,而expression

在return語句之後永遠都不會被執行到。

2. 示例

2.1 指明返回值

<code>/<code>

以上代碼的執行結果如下圖所示。我們用實參9調用函數twice(),它先計算9的兩倍然後再返回該結果,隨後該返回值被賦值給了變量value1。第10行的代碼打印出value1的值,可以看到它的值確實為18。

JavaScript return語句

該示例中的twice()函數還可以簡寫為下面的形式,即計算兩倍的表達式被包含在return語句中,它的結果被直接返回。這樣就不需要先聲明一個變量臨時保存計算結果,再用return語句返回該變量。

<code>/<code>

2.2 省略返回值

<code>/<code>

從下圖的執行結果中我們可以看到,首先打印出了字符串"執行函數abc().",說明函數abc()確實被執行了。第10行的代碼打印出的變量value2的值為undefined,這正是return語句的默認返回值。

JavaScript return語句

2.3 省略return語句

<code>/<code>

下圖中的執行結果表明,該示例和上一個例子的執行結果完全一致(除了變量被命名為value3之外)。該例子的成功執行表明,當一個函數的執行流程的最後一條語句是沒有顯式指定返回值的return語句時,該return語句可以被省略。

JavaScript return語句

當一個函數的執行流程的最後缺少return語句的時候,JavaScript會自動在該執行流程的最後添加一條沒有返回值的return語句,當然該函數的返回值就為undefined

了。

2.4 return語句不能在函數之外

<code>/<code>

以上代碼的執行結果如下圖所示,我們可以看到瀏覽器明確指出第3行的return語句是錯誤的。

JavaScript return語句

2.5 提前終止函數

return語句不一定非要是函數的最後一條語句,它也可以處於函數的前面或中間,用於提前終止函數的執行。示例代碼如下所示:

<code>/<code>

我們使用實參0調用函數opposite(),當實參為0的時候,會執行if語句中的代碼。它首先打印字符串"0的相反數是它自身。",然後遇到語句return 0;。這條return語句提前終止函數的執行,並返回0。因此,if語句後面的那一條打印語句和return -x;均不會被執行。下圖中的執行結果正印證了這一執行流程。

JavaScript return語句

這個例子也說明了一個函數可以包含多個return語句,用於根據不同的情況而退出函數。

2.6 自動添加分號

<code>/<code>

該示例的執行結果如下圖所示,可以看到第11行打印出的變量value5的值為undefined,而不是我們原本期望的數字18。這是怎麼回事呢?

JavaScript return語句

這個示例和第一個例子唯一的不同就是我們把return語句拆成了兩行,return關鍵字和它的返回值result被寫在了不同的行上。在其它編程語言或者JavaScript的某些其它語句中,這樣的拆行不會對原程序有任何影響。

但JavaScript的return語句是個例外,在本文的開頭我們就說過如果return關鍵字和它的返回值之間有換行符的話,JavaScript會自動在return關鍵字之後插入一個分號,此時該return語句的意義就和我們所期望的不同了。

這樣自動插入分號的結果就會讓該示例中的twice()函數實際等同於下面的代碼。此時無論傳遞的參數是多少,return語句都會提前終止函數並默認返回undefined,而變量result始終都不會被返回。

<code>/<code>

如果你真的想要將return語句寫在多行上,那麼你可以將返回值用括號括起來。但請一定要注意,此時左括號也必須要和return關鍵字寫在同一行上,就像下面的代碼這樣:

<code>/<code>

(完)


分享到:


相關文章: