JavaScriptにおけるreturnの使い方・意義について
現在ProgateでJavaScriptの学習をしています。
そこでreturnという概念が出てきたのですが、正直理解できません。
具体的には、「returnを使うと何ができるのか」、「使わない場合と比べてどんな利点があるのか」、「使わない場合に出来ないことはどんなことか」等がわからず困っています。
例えば、下の例であれば、どちらも結果としては同じ「4」が返ってきます。
であれば、下のようにreturnを用いて記述する理由は何なのでしょうか。
恥ずかしながら、Progateのスライドや過去の似たような質問を読んでもよくわかりませんでした…。
具体例を挙げてご説明いただけると大変助かります。よろしくおねがいします。
該当のソースコード
returnを使わないコード
JavaScript
1const add = (a,b)=>{ 2console.log(a+b); 3}; 4add(1,3)
returnを使ったコード
JavaScript
1const add = (a,b)=>{ 2return a+b; 3}; 4const sum = add(1,3); 5console.log(sum);
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/07 05:09
回答5件
0
どちらも結果としては同じ「4」が返ってきます。
前者の場合、console.log
が作り付けなので、この「4」を関数の外から使うことができません。
後者の場合、受け取った4
は、console.log
するだけではなく、関数から帰ってきた側で他の計算に使うことも可能です。
投稿2019/05/07 03:12
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/07 04:08
2019/05/07 04:10
2019/05/07 04:48
2019/05/07 05:03
0
プログラミング言語は数学の世界の概念を使ったものが多く用いられています。
関数も数学由来の概念です。
数学における関数とは、かつては、ある変数に依存して決まる値あるいはその対応を表す式の事であった。
関数に「ある値」を渡してやると、結果が値として帰ってきます。
結果が帰ってこない、つまりreturn
が存在しない処理の塊を「サブルーチン」と呼びます。
JavaScriptでは関数もサブルーチンも同じfunction
で作ります。
混同しがちですが、出来るだけこの数学の用語の関数を意識すると良いです。
ちなみに、VBAなどの言語では、
値が帰ってこない「サブルーチン」というものが関数とは別に存在します。
なぜfunctionを定義する際、
出来るだけ数学の意味と同じく値を返す方が良いのかといえば、
テストしやすいからです。
例えばChrome等のブラウザでJavaScriptの動作チェックをするようにします。
例題としてfizzbuzzを作ってみましょうか
JavaScript
1var fizzbuzz = function (it) { 2 if (it % 3 === 0) { 3 return 'Bizz'; 4 } 5 if (it % 5 === 0) { 6 return 'Buzz'; 7 } 8 return '' + it; 9}
おおっと、何処かおかしい気がしますが、スルーしてくださいね。
これのテストを書いて行きます。
JavaScriptにはconsole.assert
というものがあり、これによりどういう動作を期待するのかを実行出来るコードとして残して置くことが可能です。
JavaScript
1// 実験的に使ってみよう 2console.assert(1 === 1, '1 is 1!!'); 3// [何も表示されない] 4 5console.assert(1 === 2, '1 is 2!!'); 6// Assertion failed: 1 is 2!!
なるほど、中の式がfalseな場合だけ第二引数の文字列と共に怒ってくれるんですね。
JavaScript
1var fizzbuzz = function (it) { 2 if (it % 3 === 0) { 3 return 'Fizz'; 4 } 5 if (it % 5 === 0) { 6 return 'Buzz'; 7 } 8 return '' + it; 9} 10 11console.assert(fizzbuzz(1) === '1', '1 is "1"'); 12console.assert(fizzbuzz(2) === '2', '2 is "2"'); 13console.assert(fizzbuzz(3) === 'Fizz', '3 is "Fizz"'); 14console.assert(fizzbuzz(4) === '4', '4 is "4"'); 15console.assert(fizzbuzz(5) === 'Buzz', '5 is "Buzz"'); 16console.assert(fizzbuzz(6) === 'Fizz', '6 is "Fizz"'); 17console.assert(fizzbuzz(7) === '7', '7 is "7"'); 18console.assert(fizzbuzz(8) === '8', '8 is "8"'); 19console.assert(fizzbuzz(9) === 'Fizz', '9 is "Fizz"'); 20console.assert(fizzbuzz(10) === 'Buzz', '10 is "Buzz"'); 21console.assert(fizzbuzz(11) === '11', '11 is "11"'); 22console.assert(fizzbuzz(12) === 'Fizz', '12 is "Fizz"'); 23console.assert(fizzbuzz(13) === '13', '13 is "13"'); 24console.assert(fizzbuzz(14) === '14', '14 is "14"'); 25console.assert(fizzbuzz(15) === 'FizzBuzz', '15 is "FizzBuzz"');
これを実行した結果はご覧の通り
Assertion failed: 15 is "FizzBuzz"
これに気がついて関数fizzbuzzをこのように修正して事なきを得ました。
JavaScript
1var fizzbuzz = function (it) { 2 if (it % (3 * 5) === 0) { 3 return 'FizzBuzz'; 4 } 5 if (it % 3 === 0) { 6 return 'Fizz'; 7 } 8 if (it % 5 === 0) { 9 return 'Buzz'; 10 } 11 return '' + it; 12} 13 14// テストコードもリファクタリング 15[ 16 {it: 1}, 17 {it: 2}, 18 {it: 3, expected: 'Fizz'}, 19 {it: 4}, 20 {it: 5, expected: 'Buzz'}, 21 {it: 6, expected: 'Fizz'}, 22 {it: 7}, 23 {it: 8}, 24 {it: 9, expected: 'Fizz'}, 25 {it: 10, expected: 'Buzz'}, 26 {it: 11}, 27 {it: 12, expected: 'Fizz'}, 28 {it: 13}, 29 {it: 14}, 30 {it: 15, expected: 'FizzBuzz'} 31].forEach(({it, expected}) => { 32 if (!expected) expected = '' + it; 33 console.assert(fizzbuzz(it) === expected, `${it} is "${expected}"`); 34});
はい、何も出力されなくなりました。
上記のテストのような事は、
関数内で直接console.log
を実行して、何もreturnしないサブルーチンでは実現できません。
このように別の用途で使う可能性のあるものは、
出来るだけ数学の意味に近い関数(returnする)で作るようにしてくださいね。
投稿2019/05/07 04:20
編集2019/05/07 04:23総合スコア21158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
関数が戻す結果をreturnで行っているだけですね
いわゆるブラックボックス理論で120円入れると缶コーヒーがでてくる
自動販売機(120円);
で、自動販売機は中で「return 缶コーヒー」しているわけです
ちなみに例示いただいたサンプルの場合通常はreturnで書きません
javascript
1const add= (a,b)=>a+b; 2const sum = add(1,3); 3console.log(sum);
投稿2019/05/07 03:41
編集2019/05/07 03:42総合スコア114843
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自己解決
たくさんのご回答ありがとうございます。
すべて読ませていただきましたが、現時点ですべてに返信できそうにありません。
mts10806さんがおっしゃるように経験が不足している上に、otolabさんのおっしゃるように、もっと基本的・根本的なところが理解できていないのかもしれません。ご迷惑おかけしました。
とりあえず、ご回答を参考にしながら、もっと自分で調べて勉強します。
ここでまとめて、という形で大変申し訳ありませんが、みなさんにお礼申し上げます。本当にありがとうございました。
投稿2019/05/07 05:09
総合スコア21
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。