
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。
呼び出し元は、一番上のルーチンだから、実質的にはグローバル変数になります。」
とおしえてることでしょうか?
また、呼び出し元は何を基準に決定されるのでしょうか?
No.6ベストアンサー
- 回答日時:
#3 でご質問の
> どのようにCPUやメモリが動いているか
について。
おそらく初心者向けの簡易な説明を期待なされているかと思いますが、
とても深い内容なのでなかなか難しいです。
そのため、斜め上の回答となったことを先にお詫びします。
難解ではあるものの入りやすい書籍として以下をおすすめします。
http://amazon.jp/dp/4774138959 - プログラミング言語を作る
http://amazon.jp/dp/4839909865 - CPUの創りかた
冗談のような表紙や題名なのですが、どちらも読み物として高水準です。
ですが一番のおすすめは、
自作ソースをコンパイルしてアセンブリ(≒機械語)を追いかけること
(参考) http://oshiete.goo.ne.jp/qa/3613934.html
今回の主題である return の挙動など、これ一発で明白となるでしょう。
No.4
- 回答日時:
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
と変化する内容が見られると思います。
ああ。。。。
完全に引数をしているのを忘れていました。。。
menseki(10);がないと、nullになりますね。。
ちなみに、m = 3.14 * r * r って、どういうタイプの変数になるんでしょう?
あるいはオブジェクトになるんでしょうか?
No.3
- 回答日時:
少々実装よりな観点から回答します。
値(≒オブジェクト)とは、メモリ上に格納されたバイナリデータです。
変数とは、値が格納されたメモリ上の位置(=アドレス)に名前をつけた識別子です。
(本当は値には即値とオブジェクトの区別がありますが、説明を省略します)
変数にはスコープがありますが、値にはありません。
そのため関数スコープ内で生成された値は、
その位置さえ分かれば、何処からでも使えるのですが、
その位置を指し示す変数がスコープ外から見えないので、
呼び出し元からは「値は存在するけれど何処にあるか分からない」状態になります。
構文 return とは、一時的に呼び出し元のスコープに変数「戻り値」を設けて、
return 引数の「値」の位置を呼び出し元に知らせる機能です。
関数呼出し後はスコープ内の変数や「戻り値」は消去されますが、
戻り値が指し示す「値」は使えるので、以降の処理で実行結果の値を利用できるわけです。
ついでに変数と値の寿命ですが、
変数は、スコープ終了時に消去されます。
値は、何処の変数からも指し示されなくなった後に、ガーベージコレクションにてメモリ上から消去されます。
すごくわかりやすいです!
ありがとうございます!
ちなみに、javascript,PHP,VBA,HTML,CSS,SQLなど他の言語について、
どのようにCPUやメモリが動いているかをわかりやすく説明したホームページや書籍をご存じないですか?
No.2
- 回答日時:
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;
No.1
- 回答日時:
質問の意図がよくわからないのですが
<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>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript 正規表現について質問です。条件に合う場合はtrueを返したい 3 2022/10/06 23:02
- JavaScript JavaScriptの即時関数の書き方 1 2022/11/29 09:52
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
ajax反映後のjqueryが動かない
-
sendRequestのcallback
-
Matlabで自作関数をオーバーロード
-
jslintのエラーについて質問
-
Javascriptで文字列操作
-
一つのアクションで関数を二つ...
-
jQueryの :not() .not() が有効...
-
処理前の「お待ちください」
-
引数に関して
-
jQueryにて、.toggle()でアニメ...
-
jquery 複数のメソッド
-
コードをスマートにさせたい。
-
クリックすると上に開くアコー...
-
javascriptの質問です。関数内...
-
JavaScript window.openで開く...
-
C#OpenCv V4にのエラーに関する...
-
ボタンをクリックすると数が増...
-
乗換案内 VBAで操作したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
クリックすると上に開くアコー...
-
関数でy=g(x)のgとは何の略です...
-
ページ内に複数表がある場合のT...
-
jQueryの :not() .not() が有効...
-
関数名をテキストから読み込む...
-
jqueryの変数を関数の外に出す方法
-
javascript(jQuery)でセル内...
-
XMLHttpRequestでキャッシュを...
-
要素名がスペースを含む場合のj...
-
jQueryの"return false"の役割...
-
処理前の「お待ちください」
-
[jQuery] クリックで連番関数を...
-
ajax反映後のjqueryが動かない
-
jQueryにて、.toggle()でアニメ...
-
Tabキーのキャンセル
-
XMLHttpRequestオブジェクトが...
-
JScriptの問題です。添削お願い...
-
jquery 複数のメソッド
おすすめ情報