これ何て呼びますか

javascriptのreturnとは?

return、あるいは返すという概念がよくわからず困っています。
教えてgooの、下のURLより、
返すというのが、「借りていたものを返す」ではなく、
「リクエストされた質問に対し返答する」という意味での「返す」であることであり、
プログラミングでは、expression(=処理?)の結果を返すことだという理解をしています。
http://oshiete.goo.ne.jp/qa/2574681.html

しかし、返された処理結果は、どこに返されるのでしょうか?
下のコードを例に私なりの解釈をします。
function menseki(r){
var m = 3.14 * r * r;
return m;
}

var m = menseki(5);
http://www.ajaxtower.jp/js/function/index4.htmlより

javascriptの下のコードでは、ルーチンにたいして、サブルーチン(=function menseki)があり、
変数mは、関数内に有るため、スコープがローカル(=変数内)にあります。(あってますか?)
このままだと、変数mは、サブルーチンの処理が終わった後、メモリから「mは3.14*r*rだよ」という情報が消されてしま宇野だともいます。
(javascriptはgarbage collectorがあり、また関数内の変数はローカルなので、関数内でしか使えないため。)

でも、この変数mを、中身(=3.14*r*r)を維持したまま、関数外で使いたいときに、
変数mのreturnをすることで、メモリに

「mは3.14*r*r。
呼び出し元は、一番上のルーチンだから、実質的にはグローバル変数になります。」

とおしえてることでしょうか?

また、呼び出し元は何を基準に決定されるのでしょうか?

A 回答 (6件)

#3 でご質問の


> どのようにCPUやメモリが動いているか
について。

おそらく初心者向けの簡易な説明を期待なされているかと思いますが、
とても深い内容なのでなかなか難しいです。
そのため、斜め上の回答となったことを先にお詫びします。

難解ではあるものの入りやすい書籍として以下をおすすめします。
http://amazon.jp/dp/4774138959 - プログラミング言語を作る
http://amazon.jp/dp/4839909865 - CPUの創りかた
冗談のような表紙や題名なのですが、どちらも読み物として高水準です。

ですが一番のおすすめは、
自作ソースをコンパイルしてアセンブリ(≒機械語)を追いかけること
(参考) http://oshiete.goo.ne.jp/qa/3613934.html
今回の主題である return の挙動など、これ一発で明白となるでしょう。
    • good
    • 0

> ちなみに、m = 3.14 * r * r って、どういうタイプの変数になるんでしょう?



この場合の変数 m は数値型の変数になります。
    • good
    • 0

var m;


function menseki(r){
m = 3.14 * r * r; //ちなみに、var mにした場合は、えらーになるのでしょうか?
};
var x = m;

これの結果は、実行してみればわかると思いますが最後の変数 x の中身は空っぽ(null)です。

最初の var m; で変数 m がメモリ上に作成されますが中身は空っぽです。
次に function ・・・ が出現しますが、関数の定義が行われただけです。
関数の中身はどこかでその関数をコールしないと実行されません。
従って関数定義が終了する }; まではスルーされます。
次に変数 x を定義して、そこに変数 m の値を代入していますが、変数 m の中身は空っぽのままなので変数 x に空っぽがコピーされるだけです。
var x = m; の後に alert(x); とか alert(m); を実行すると、何れも null と表示されるでしょう。

プログラムを以下のようにすると

var m;
function menseki(r){
m = 3.14 * r * r;
};
alert(m); // ココでは null
menseki(5);
var x = m;
alert(m); // ココでは 78.5
alert(x); // ココでは 78.5
menseki(10);
alert(m); // ココでは 314
alert(x); // ココでは 78.5

と変化する内容が見られると思います。
    • good
    • 0
この回答へのお礼

ああ。。。。
完全に引数をしているのを忘れていました。。。

menseki(10);がないと、nullになりますね。。

ちなみに、m = 3.14 * r * r って、どういうタイプの変数になるんでしょう?
あるいはオブジェクトになるんでしょうか?

お礼日時:2013/05/21 22:09

少々実装よりな観点から回答します。



値(≒オブジェクト)とは、メモリ上に格納されたバイナリデータです。
変数とは、値が格納されたメモリ上の位置(=アドレス)に名前をつけた識別子です。

(本当は値には即値とオブジェクトの区別がありますが、説明を省略します)

変数にはスコープがありますが、値にはありません。
そのため関数スコープ内で生成された値は、
その位置さえ分かれば、何処からでも使えるのですが、
その位置を指し示す変数がスコープ外から見えないので、
呼び出し元からは「値は存在するけれど何処にあるか分からない」状態になります。

構文 return とは、一時的に呼び出し元のスコープに変数「戻り値」を設けて、
return 引数の「値」の位置を呼び出し元に知らせる機能です。
関数呼出し後はスコープ内の変数や「戻り値」は消去されますが、
戻り値が指し示す「値」は使えるので、以降の処理で実行結果の値を利用できるわけです。

ついでに変数と値の寿命ですが、
変数は、スコープ終了時に消去されます。
値は、何処の変数からも指し示されなくなった後に、ガーベージコレクションにてメモリ上から消去されます。
    • good
    • 0
この回答へのお礼

すごくわかりやすいです!
ありがとうございます!
ちなみに、javascript,PHP,VBA,HTML,CSS,SQLなど他の言語について、
どのようにCPUやメモリが動いているかをわかりやすく説明したホームページや書籍をご存じないですか?

お礼日時:2013/05/21 21:36

menseki 関数(質問者さんの表現ではサブルーチン)の中で定義された m という変数は、その関数内で有効なローカルスコープの変数です。


従って、関数内の処理が終わった時点でメモリから消えてしまうと言う認識で合っています。

ただし、変数 m には「3.14 * r * r」という計算式が入っている訳では無く、「3.14 * r * r」という計算結果が入っています。

var m = menseki(5); を実行すると menseki 関数に引数として 5 を渡して計算を行います。
関数内では渡された引数を r という変数に入れます。
そして「3.14 * r * r」という計算をした結果 78.5 という数値が関数内の変数 m に入ります。
return m; で呼出元に関数内の変数 m の中身を返します。

menseki 関数から返ってきた値は、メインルーチンに書かれている代入式に従って、メインルーチンの変数 m に代入されます。
これでメインルーチンの変数 m には 78.5 という数値が入ります。

多分、メインルーチンと関数内で同じ変数名を使っているから分かりにくいのだと思いますので、メインルーチンを
var x = menseki(5);
として考えてみてください。
この結果はメインルーチンの変数 x に menseki 関数が処理結果として返してきた 78.5 という数値が入ります。
そして、この行の処理が終わったら関数内の変数 m はメモリ上から消滅します。

この回答への補足

ありがとうございます。
なんとなくわかったような気がします。このような理解で宜しいでしょうか?

function menseki(r){
var m = 3.14 * r * r;
return m;
}
var x = menseki(5);


1.1行目では、因数はr
2.2行目では、変数mが 3.14*r*rというオブジェクト(?)として、メモリに保管される
3.3行目では、変数mがreturnされる。つまり、引数はrのままで、menseki(r)の結果がmになる。
4.5行目では、変数xの値、menseki(r)の引数を5にした場合の計算結果を出している。

5行目は、計算結果を確認したければ、alert(menseki(5));でもOKで、menseki(5)の結果を変数として格納する必然性はない。
returnがない場合は、mに計算結果が保存されるけど、保存された直後にサブルーチンが終了するので、実質的には何もおきない。
returnを使わずに、同じ結果を出すなら、

var m;

function menseki(r){
m = 3.14 * r * r; //ちなみに、var mにした場合は、えらーになるのでしょうか?
};

var x = m;

補足日時:2013/05/21 19:39
    • good
    • 0

質問の意図がよくわからないのですが



<script>
var m=0;
function menseki(r){
m = 3.14 * r * r;
}
menseki(5);
alert(m);
</script>

と、すればmはグローバル変数として処理されるし

<script>
var m=0;
function menseki(r){
var m = 3.14 * r * r;
}
menseki(5);
alert(m);
</script>

と、関数内でvarしてやればローカル変数でしかないので
呼び出し元にはmは引き継ぎません

そして、戻り値利用すればローカルのデータを引き継ぐことができます。
<script>
var m=0;
function menseki(r){
var m = 3.14 * r * r;
return m;
}
m=menseki(5);
alert(m);
</script>

なお、この例だとあくまでも数値として戻ってきているので
質問者さんのいう「3.14*r*r」が返ってきているのとは若干
ニュアンスがちがうかもしれません。

<script>
var m=0;
function menseki(r){
var m = 3.14 * r * r;
return m;
}
m=menseki(5);
alert(typeof m);
</script>
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!