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

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

ただいまの
回答率

89.64%

返り値について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,059
退会済みユーザー

退会済みユーザー

『return result;』について

下記例でいうならば、関数が実行、呼び出された所に、処理結果が戻る、移動するので、下記例の場合sum(1,2);/に移動する。
つまり、var answerの中に入る。


<script>
function sum(a,b){
var result = a + b;
return result;
}
var answer = sum(1,2);//引数をスコープの外に記載し、わざわざ関数SUMに引数を渡さないといけない
console.log(answer);//定義した関数の呼び出しをしないと定義した関数が実行できない。
</script>

という認識でよろしいでしょうか。
関数が呼び出されたところに処理結果が戻るという部分が抽象的ではっきりとしません。

いつもすいませんがよろしくお願い致します。

ちょっとうまく伝えられていないので別の例を追記します。
関数、引数の一連の処理。

function dispMsg(str){
  document.write("<p>");2番目に実行、4番目に実行、5番目に実行
  document.write(str);
  document.write("</p>");
 var result = str + ’girl’;
   return result;
}

1番目に実行dispMsg("Hello");関数の呼び出し1
3番目に実行 document.write("<p>Good morning</p>");関数の呼び出しではない
4番目に実行 dispMsg("bye");関数の呼び出し2

スクリプトは記述された順に上から下へ実行されていきますが、関数内に記述された処理は関数が呼び出されるまで実行されません。
つまりfunction dispMsgはいきなり実行されない。

そして関数呼び出しが行われるといったん、function dispMsg に値が移動し、
function dispMsg 関数内の処理を実行した後で、
関数呼び出しの次の行(document.write("<p>Good morning</p>"); )へ再度処理が移ります。

引数Helloはfunction dispMsg 関数に渡され、
function dispMsg(’Hello ’)となる。
そして、  document.write(str);とdocument.write(str);の引数が同じなので、
(’Hello ’)は、document.write(str);に渡され、
document.write('Hellow');となり、
結果的に、HellowとPタグの 間に記載される。

よって引数は同じ値名の所に渡されていくということになる。

var result = str + ’girl’;
return result;
の部分は、
まずhellowgirlになってresult変数に渡される。
次にreturn hellowgirlとなり、
hellowgirlが返り値として、function dispMsgに渡されるのでしょうか?

やっぱり返り値がよくわかりせん。

  1.  

イメージ説明

  1.  

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

function dispMsg(str){
  document.write("<p>");
  document.write(str);
  document.write("</p>");
  var result = str + 'girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


誤解を恐れずに言えば、戻り値とは「関数呼び出しの部分が差し替わる値」です。

仮想的なコードで書いて、動作を追ってみましょう。
まず、dispMsg("Hello");でdispMsgに引数"Hello"を持って処理が移動します。

function dispMsg( str = "Hello" ){
  document.write("<p>");
  document.write("Hello");
  document.write("</p>");
  var result = "Hello" + 'girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


次に、document.write関数が実行され、DOMに<p>が書き出され、戻り値undefinedが戻ります。
先ほど書いた通り、戻り値とは「関数呼び出しの部分が差し替わる値」ですので、document.write("<p>");がundefinedに差し替わります。

function dispMsg( str = "Hello" ){
  undefined;
  document.write("Hello");
  document.write("</p>");
  var result = "Hello" + 'girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


undefinedが評価され(なにも起きない)、次の行に処理が移ります。

function dispMsg( str = "Hello" ){
  document.write("Hello");
  document.write("</p>");
  var result = "Hello" + 'girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


前行と同様に、DOMに"Hello"が書き出され、戻り値undefinedが戻ります。

function dispMsg( str = "Hello" ){
  undefined;
  document.write("</p>");
  var result = "Hello" + 'girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


undefinedが評価され(なにも起きない)、次の行に処理が移ります。

function dispMsg( str = "Hello" ){
  document.write("</p>");
  var result = "Hello" + 'girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


前行と同様に、DOMに"</p>"が書き出され、戻り値undefinedが戻ります。

function dispMsg( str = "Hello" ){
  undefined;
  var result = "Hello" + 'girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


undefinedが評価され(なにも起きない)、次の行に処理が移ります。

function dispMsg( str = "Hello" ){
  var result = "Hello" + 'girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


"Hello" + 'girl' が評価され、'Hello girl'になります。

function dispMsg( str = "Hello" ){
  var result = 'Hello girl';
  return result;
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


var result = 'Hello girl';が評価され、ローカル変数resultに代入されます。

function dispMsg( str = "Hello" ){
  return 'Hello girl';
}
dispMsg("Hello");
document.write("<p>Good morning</p>");
dispMsg("bye");


return 'Hello girl';が評価され、dispMsg("Hello")の戻り値として'Hello girl'を戻します。

'Hello girl';
document.write("<p>Good morning</p>");
dispMsg("bye");


'Hello girl';が評価され(なにも起きない)、次の行に処理が移ります。

document.write("<p>Good morning</p>");
dispMsg("bye");


同様に、DOMに"<p>Good morning</p>"が書き出され、戻り値undefinedが戻ります。

undefined;
dispMsg("bye");


undefinedが評価され(なにも起きない)、次の行に処理が移ります。

dispMsg("bye");


dispMsg("Hello");が評価され、dispMsgに引数"bye"を持って処理が移動します。

function dispMsg(str = "bye"){
  document.write("<p>");
  document.write("bye");
  document.write("</p>");
  var result = "bye" + 'girl';
  return result;
}
dispMsg("bye");


もう、省略していいですよね?

最終的に、このプログラムの評価値は、'bye girl'です。
戻り値とは「関数呼び出しの部分が差し替わる値」ということ、感覚的にご理解いただけましたか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/28 08:37

    つまりreturn resultとはresultという変数を返り値として返しなさいと返すものを指定しているということですか?
    式はどこに返すか指定しているのではなく、何を返すか指定しているのですね。

    すると返す場所は、指定することはある意味できず必然的に関数を定義した、
    場所に渡す(返す)ということでよいでしょうか?

    上記のように言う方も出てきているのですが、
    return の式はどこに返すかの指定ではなく、変数の呼び出しに、何を返すか指定するということなのでしょうか?

    キャンセル

  • 2016/12/28 09:56

    そうですね。

    数学はお得意ですか? あれでも関数という概念が出てきたと思うのですが、基本的には同じものです。
    戻り値とは、変数をある値に確定させた時に関数がとる値、だと思えば分かりやすいかもしれないです。

    キャンセル

  • 2016/12/28 14:04

    ありがとうございました。

    キャンセル

+2

人間は同じような行程を何度も行うときに「ツール」のようなものを使いますね。
例えばですが、パン工場を想像してみてください。
「粉を混ぜる→捏ねる→整形する→焼く→包装する」のような、
決まったことを行うために、人間はそのルールに従う機械を作ります。
しかし機械を作っただけでは稼働していないのです。
原料を入れて、稼働させることでパンは出来上がります。

プログラムも一緒です。

//ここでは機械(関数)を作っていますので、稼働はしていません。
//引数は機械で言う原材料、この機械ではaとbという材料を使用します。
function breadMachine (a, b) {
    //ここでは実際原材料を駆使して結果を作るための過程を記述
    var result = a + b;

    //ここで製造結果を排出する
    return result;
}

//関数を定義してから、ようやく稼働(実行)できます
//ここではaに2,bに7という原材料を渡します
//そして生産されたものをdataという箱(変数)に入れます
var data = breadMachine(2, 7);

関数の定義はあくまでも作っているだけなので、
実行は使うときと考えていただければと思います。
これが複数重なっていても規則は同じで、
上から順に実行していくだけです。

お力になれれば幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/25 11:50

    return文の役割ですが、
    関数としての出力がなければこの一行は無くても良いです。
    その場合、

    var data = breadMachine(2, 5);

    をしても、dataには何も入りません。
    関数の中でreturnで定義されたもののみ出力されます。

    こちら以外はおかげさまでわかったのですが、やはりここのみわかりません。
    ここだけ教えてもらえますか?

    キャンセル

  • 2016/12/25 13:13

    自分で調べた結果下記のように考えたのですが正しいでしょうか?

    ・その『関数』が呼び出された場所まで処理が戻ります。
    下記の例ならvar answerの中身のsum(1,2);に処理結果が入る。つまり、var answer=3となる

    <script>
    function sum(a,b){
    var result = a + b;
    return result;
    }
    var answer = sum(1,2);//引数をスコープの外に記載し、わざわざ関数SUMに引数を渡さないといけない
    console.log(answer);//定義した関数の呼び出しをしないと定義した関数が実行できない。
    </script>

    キャンセル

  • 2016/12/28 08:38

    つまりreturn resultとはresultという変数を返り値として返しなさいと返すものを指定しているということですか?
    式はどこに返すか指定しているのではなく、何を返すか指定しているのですね。

    すると返す場所は、指定することはある意味できず必然的に関数を定義した、
    場所に渡す(返す)ということでよいでしょうか?

    上記のように言う方も出てきているのですが、
    return の式はどこに返すかの指定ではなく、変数の呼び出しに、何を返すか指定するということなのでしょうか?

    キャンセル

0

例えば

var answer = 4 + 2;


これが実行されたらanswer6が入ることは大丈夫だと思います。
じゃあこのとき何が起きているかですが、

  1. 変数answerを用意する。
  2. 4 + 2を実行(評価)する
  3. answer に 4 + 2 を実行した「結果」を代入する。

4 + 2 を実行した「結果」というのは、6になるので、
answer6が入ります。

この例だと代入されるのは4 + 2を実行した「結果」でしたが、
関数呼び出しでも同じです。


では関数を使ってみます:

function f(){
    return "nice text.";
}

var answer = f();

var answer = f();
は、4 + 2の例と同様に、

  1. 変数answerを用意する。
  2. f()を実行する
  3. answer に f() を実行した「結果」を代入する。

じゃあ
f() を実行した「結果」
って何だよって話ですが、
それを指定しているのがreturn文です。

f()は冒頭で

function f(){
    return "nice text.";
}


と「定義」されています。
この「定義」の中で、
return "nice text."
つまり、「関数fを実行した「結果」は"nice text."にしてね」と「宣言」しているわけです。

よってこの例だと、
answer"nice text."が入ります。


そしてあなたが大変混乱している「~返す」と言う表現は
「これを実行した「結果」は~です」ということです。

例えば
4 + 2を実行すると6を「返し」ます

function f(){
    return "nice text.";
}


と定義される関数fを実行する:f()"nice text."を「返し」ます。

みたいに。

そしてこの「返った」(戻った)値が「返り値」(戻り値)です。


※初心者用に正確でない表現を使っています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/27 22:35

    つまりreturn resultとはresultという変数を返り値として返しなさいと返すものを指定しているということですか?
    式はどこに返すか指定しているのではなく、何を返すか指定しているのですね。

    すると返す場所は、指定することはある意味できず必然的に関数を定義した、
    場所に渡す(返す)ということでよいでしょうか?

    キャンセル

  • 2016/12/28 08:53

    > resultという変数を返り値として返しなさいと返すものを指定している
    > 式はどこに返すか指定しているのではなく、何を返すか指定しているのですね。

    はい

    > すると返す場所は、指定することはある意味できず必然的に関数を定義した、
    場所に渡す(返す)ということでよいでしょうか?

    いいえ、実行した場所です。

    キャンセル

  • 2016/12/28 14:10

    つまりreturn resultとはresultという変数を返り値として返しなさいと返すものを指定しているということですか?
    式はどこに返すか指定しているのではなく、何を返すか指定しているのですね。

    すると返す場所は、指定することはある意味できず必然的に関数を定義した、
    場所に渡す(返す)ということでよいでしょうか?

    return の式はどこに返すかの指定ではなく、変数の呼び出しに、何を返すか指定するということなのでしょうか?

    キャンセル

0

(コメントに書こうと思って間違えました)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る