質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

299閲覧

JavaScriptにおけるreturnの使い方・意義について

code320

総合スコア21

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/05/07 03:07

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2019/05/07 03:14

returnはプログラムの基本中基本なので理解出来ないとほざくようなら辞めてしまった方が早いですよ。
miyabi_takatsuk

2019/05/07 05:09

stdioさん>厳しくもその通りですね。ほぼ全言語にある概念ですしね。
guest

回答5

0

どちらも結果としては同じ「4」が返ってきます。

前者の場合、console.logが作り付けなので、この「4」を関数の外から使うことができません。

後者の場合、受け取った4は、console.logするだけではなく、関数から帰ってきた側で他の計算に使うことも可能です。

投稿2019/05/07 03:12

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

code320

2019/05/07 04:08

maisumakunさん、早速のご回答ありがとうございます。 ご回答を受けて自分なりに、まとめてみたのですが、 returnを使わないコードは addという定数があり、aとbを足した結果を戻り値として返してくれるという機能を持っている。 なのでこの定数addに、引数として1と3を入れると、結果として4(戻り値)が返ってくる。 returnを使ったコードは returnを使わない上記のコードの動きに加えて、その結果を定数(この場合はsum)として定義して、別の計算にも使えるようにしている。 という理解でよろしいですか? また、「受け取った4を他の計算に使うことも可能」というのは、以下のような例ですか? const add2= (c,d)=>{ console.log(c+d); }; add2(sum,3); //4が代入されたsumと3を足して7
maisumakun

2019/05/07 04:10

前者は内部でconsole.logをしているだけなので、「戻り値」はありません(無理やり取ればundefinedという値になっています)。
m.ts10806

2019/05/07 04:48

既に良い回答が出そろっているのでこちらでぶら下がらせていただきますが、 質問者さんはもっとたくさん検証のコードを書いてみたほうが良いと思います。 そこで「これはできない」「これはできる」から「こういう使い方もできそう」と展開されるはずなので、ついた回答をヒントに自分でも色々検証してみてください。
stdio

2019/05/07 05:03

mts10806さんに乗っからせて頂きます。 JavaScriptを最初にやろうとするから迷ったのかな? C言語なら戻り値の型指定しないといけないからまずそっちを勉強した方が早そうですね。 基本をしっかりと身に着けていない状況でJavaScriptを行うのは質問者さんにとっては難しい事だと思いました。Pythonなら余計に迷っていたな。
guest

0

プログラミング言語は数学の世界の概念を使ったものが多く用いられています。
関数も数学由来の概念です。

関数 (数学) - Wikipedia

数学における関数とは、かつては、ある変数に依存して決まる値あるいはその対応を表す式の事であった。

関数に「ある値」を渡してやると、結果が値として帰ってきます。

結果が帰ってこない、つまり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
miyabi-sun

総合スコア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
yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

たくさんのご回答ありがとうございます。
すべて読ませていただきましたが、現時点ですべてに返信できそうにありません。
mts10806さんがおっしゃるように経験が不足している上に、otolabさんのおっしゃるように、もっと基本的・根本的なところが理解できていないのかもしれません。ご迷惑おかけしました。
とりあえず、ご回答を参考にしながら、もっと自分で調べて勉強します。
ここでまとめて、という形で大変申し訳ありませんが、みなさんにお礼申し上げます。本当にありがとうございました。

投稿2019/05/07 05:09

code320

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

returnの意義というより、関数とはなにかという方向から考えたほうが良いかもしれないですね。

投稿2019/05/07 04:19

otolab

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問