こんばんわ。最近JSを勉強しだして、for文、whileやif、switchとやっと
書けるようになり。。。楽しくなってきました。
そこで質問なんですが、サブルーチンという言葉をよく耳にするのですが
これは何にあたるものなのでしょうか?関数のことなのですか?
どう言う時に使用するものなのでしょう・・・
参考書などを読むと繰り返し使うときにサブルーチンを利用して・・・・
とかいてあるのですが、for文などに似た書き方があるのでしょうか?
言葉の意味すらわかってないかもしれません・・・すみません
こんな初歩的な質問で・・・
どなたかこんな私にも教えるのがお上手な方、是非ご解答下さい・・
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

これは何もJavaScriptに限った話ではありませんが。

。。

 まず、プログラムの起動時に実行され始め、分岐やループなどの構文に従って流れていくプログラムの本流ともいえる部分を「メインルーチン」と呼びます。

 さて、プログラムの中のあちこちに同じような処理をする部分があった場合、これを何度も記述するのは面倒ですので、次のようなことができます。
 この同じような処理をメインルーチンから抜き出して別の場所に置き、この処理が必要になる度ここに飛んできて、処理が終わったら元の場所へ流れを戻す。
 この抜き出された処理をメインルーチンに対して「サブルーチン」と呼ぶのです。
(「繰り返し使われる処理」などの記述から、forの親戚か?と思ったわけですよね。そうではないということです。)

 JavaScriptやCではサブルーチンの動作に汎用性を持たせるため、オプション的な要素「引数(ひきすう)」を与えることができ、また処理の結果を「戻値(もどりち)」として受け取ることができます。(機能的な面より、サブルーチンではなく関数と呼ばれます。)
 例えば、円の面積をいくつも求めるプログラムにおいて
  r = 3
  call MENSEKI
  print s
   :

 sub MENSEKI
  s = r * r * 3.14
 end MENSEKI
# サブルーチンの仕様に、メインが合わせなければならない。

と書く代わりに、
  s = MENSEKI( 3 )
  print s
   :

 function MENSEKI( r )
  return( r * r * 3.14 )
 end MENSEKI
# メインからの呼びかけに、サブが応える。

のように書けます。
※これはあくまで抽象的に書いただけで、何かのプログラム言語などではありません。

この回答への補足

こんばんわ。
ご解答ありがとうございます。例までお書きくださって感謝します。

そうなんです、繰り返し=FORの親戚?と思ってしまってました(笑)
謎が解けたような気がします。

一つ関数を用いてPGを書きその処理を他の関数でも使用したい場合
また同じように書くと能率が悪いのでそれをサブルーチンとして何度も
使用するということですね。なるほど・・・。

で、書き方なんですが、JSで調べてるとはVBとかでよくみる書き方
「sub~」というのは見当たらないのですが、特別な書き方があるのでしょうか?
それともその関数のPGを変数にしてしまって、変数を書きこむのでしょうか?

すみません。。初歩的な質問で・・・

補足日時:2001/06/09 00:01
    • good
    • 0

JavaScriptの関数は次のように書きます。


 function 関数名(仮引数)
 {
   関数の処理
     :
   return 値;
 }

これを呼び出すには次のようにします。
 関数名(実引数);

ここで・・・
 「仮引数(かりひきすう)」とは関数の中だけで使える変数で、呼びだし側が「実引数(じつひきすう)」として指定した定数または変数の値が入ります。
 関数内でreturnに指定された値は、関数を呼び出した側に渡されます。この値は
  a = 関数名(実引数);
のように変数で受け取るとか、
  document.write(関数名(実引数));
のように直接使うとか、計算式の中に値のひとつとして組み込むなどできます。

処理結果を必要としないのであれば、戻値を返す、受け取る必要はありません。
    • good
    • 0
この回答へのお礼

こんばんわ。詳しくご解答頂きました本当に
有難うございました。
とても助かり感謝しております。
有難うございました。

お礼日時:2001/06/09 23:46

皆さんが言われることは間違いではないですが、仮に一度しか使わないものでも、サブルーチン化します。



人間がパッと見てわかるのはせいぜい50行くらいと言われており、それを目安にサブルーチン分けします。

勿論、いい加減に分けるのではなく、意味のあるキチンとしたまとまり単位に分けるのです。「機能単位」と言っていいでしょう。

そうしないととんでもなく長ったらしいプログラムができてしまいます。
そうすると、

1)障害が多く発生する。
2)作業を分担できない。
3)理解しづらい。
4)開発工数が長くかかる。

のです。
    • good
    • 0
この回答へのお礼

こんばんわ。サブルーチンの利点、何の為に使うのか
良くわかりました。ありがとうございました。

早々のお返事感謝しております。

お礼日時:2001/06/09 00:13

こんばんわ


サブルーチンについてですが、プログラムを作成する中で繰り返し使う処理を
別プログラムとして登録しておき、プログラム中で呼び出して使うことを
サブルーチンと言います。同じ計算式を何度使用する様なときとかです。
まあ、プログラムに処理を全部書き込むとコンパイル(機械語:c言語とかのとこ)にするのが大変になるので別プログラムにします。
例としては、”call”文などで呼び出します(?これは、cobolの場合か・・・)こんなんでいいですか?わかりました?

この回答への補足

こんばんわ。早々のご解答ありがとうございます。

と言う事は・・、たとえば
ある一つの関数を用いてPGをつくり((1)とする)それを、
違う関数の処理で、(1)の関数を書いて呼び出すというわけですね。
その(1)の関数は何回でも他の関数で呼び出す事ができる。。
ということですよね?(笑)

あってるかな・・・

補足日時:2001/06/08 23:55
    • good
    • 0

今は、やって居ませんのでハッキリした事は言えませんが昔、私がBASICで遊んで居たときには、サブルーチンと言うのは、同じプログラムの中で何度も同じ様な動作をするプログラムを(例えば、X+Y=?)使う時に一々同じプログラムをメインルーチンのそれぞれに書くのは能率的では有りませんし余計なメモリーを使うだけです。

そこでサブルーチンとして(”計算”(X+Y))の様な式を書いて、そこに引数としてX,Yを添えて渡し、出された結果を受け取る 要するに何度も繰り返しやるような事は小さい一つのプログラムに任せて仕舞うと言うのがサブルーチンの役目です。
    • good
    • 0
この回答へのお礼

こんばんわ、早速のお返事感謝しております。
謎が解けました。ありがとうございました。

お礼日時:2001/06/09 00:12

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qjs for文 条件式

javascript

function generateCalendarPulldown(){
//var nowDate = new Date(today);
var year = Number(todayArr[0]);
var mon = Number(todayArr[1]);

var $selectYear = $('#dialog_panel .dialog_body ul li select#year');
var $selectMonth = $('#dialog_panel .dialog_body ul li select#month');

$selectYear.empty();
$selectYear.empty();

for(var y = year; y < year + 2; y++){
$selectYear.append(new Option(y, y));
}
for(var m = 1; m < 13; m++){
$selectMonth.append(new Option(m, m));
}
$selectYear.val(year);
$selectMonth.val(mon);
generateDay();
}

javascriptのコードなのですが12行目のfor文の初期化式なのですが
for(var y = year; y < year + 2; y++)の条件式の部分の
「 y < year + 2 」、yが yearよりも小さければ処理を続けるという意味だと思うのですが
year + 2の部分の意味が良く理解できていないのですが
日本語で解説するとどのような文章になるでしょうか?
(yが year より小さければ year に2を足すという意味ではないですよね?)

javascript

function generateCalendarPulldown(){
//var nowDate = new Date(today);
var year = Number(todayArr[0]);
var mon = Number(todayArr[1]);

var $selectYear = $('#dialog_panel .dialog_body ul li select#year');
var $selectMonth = $('#dialog_panel .dialog_body ul li select#month');

$selectYear.empty();
$selectYear.empty();

for(var y = year; y < year + 2; y++){
$selectYear.append(new Option(y, y));
}
for(var m = 1; m < 13; m++){
$selectMonth.append(new...続きを読む

Aベストアンサー

for文の書式と意味は理解されていますね?
「 y < year + 2 」はforループの終了条件です。
yは整数ですから「 y ≦ year + 1 」とも書けます。

で。
このforループは何を処理する繰り返し処理でしょう?
yearは何を格納する変数でしょう?
そこを理解できればyear+1まで処理を繰り返す意味がわかるかと思います。

generateCalendarPulldown()は何をするものなのか(=機能)とその入出力を理解すれば、「それを行うにはこういう処理をすればよい」(=アルゴリズム)を自身で考える事が出来ます。
人が書いたプログラムを読む際は、その自分の考えとプログラムを書いた人の考えの差を埋める作業を行えばよいことになります。
その辺、つまりアルゴリズムをきちんと考える事が出来ないので「この処置は何でこうなんだろう?」とか「この処理は何をしているんだろう?」に陥りやすいのだと思います。

Javascriptに関していろいろ質問されているようですが根っこはそこにあるように感じます。
あとは基本文法の理解ですね。
練習問題を解いていたり、実際のソースコードを解析してJavascriptを勉強しようとされているのでしたら、少し背伸びをし過ぎかなぁという印象を受けます。もう少し基本的なところをしっかり勉強してから掛かった方がよいように思います。

参考まで。

for文の書式と意味は理解されていますね?
「 y < year + 2 」はforループの終了条件です。
yは整数ですから「 y ≦ year + 1 」とも書けます。

で。
このforループは何を処理する繰り返し処理でしょう?
yearは何を格納する変数でしょう?
そこを理解できればyear+1まで処理を繰り返す意味がわかるかと思います。

generateCalendarPulldown()は何をするものなのか(=機能)とその入出力を理解すれば、「それを行うにはこういう処理をすればよい」(=アルゴリズム)を自身で考える事が出来ます。
人が書いたプ...続きを読む

Qこのソースのif文をswitch文に代えるには、どうすればいいでしょうか?

ボタンの数を増やすのに、switch文に代えられたらなと、思ったのですが
pushbutton関数の引数(0や1、2…)をswitch文のcase 0:~case 2:等にマッチさせる
案が浮かびません。
方法があるなら教えてください。よろしくお願いします。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>JavaScript training</title>
</head>
<body>
<form>
<input type="button" value="button0" onclick="pushbutton(0)">
<input type="button" value="button1" onclick="pushbutton(1)">
<input type="button" value="button2" onclick="pushbutton(2)">
</form>

<div id="push">message</div>

<script>
var num=0;
function pushbutton(num){
if(document.getElementById){
if(num==0){
document.getElementById("push").innerHTML="I pushed the button0";
}else if(num==1){
document.getElementById("push").innerHTML="I pushed the button1";
}else{
document.getElementById("push").innerHTML="I pushed the button2";
}
}
}
</script>
</body>
</html>

ボタンの数を増やすのに、switch文に代えられたらなと、思ったのですが
pushbutton関数の引数(0や1、2…)をswitch文のcase 0:~case 2:等にマッチさせる
案が浮かびません。
方法があるなら教えてください。よろしくお願いします。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>JavaScript training</title>
</head>
<body>
<form>
<input type="button" value="button0" onclick="pushbutton(0)">
<input type="button" value="button1" onclick="pushbutton(1)">...続きを読む

Aベストアンサー

特定divのinnerHTMLを書き換えるだけならリストから参照させる方が楽でしょう

<script>
function pushbutton(num){
var list={
0:"I pushed the button0"
,1:"I pushed the button1"
,2:"I pushed the button2"
};
document.getElementById("push").innerHTML=list[num];
}
</script>

QPerl/JavaScript/サブルーチン

はじめまして。
今ちょっといじってるプログラムについてお聞きしたいことがあります。

index.htmlのtextareaからmy.cgiを呼び出したい

のですが。my.cgiというのは
1.textareaに入力された文章をデータベースに保存。
2.日付順にソートし新しいものを一つだけ取り出す。
3.index.htmlに表示する

というものなのですが。
デフォルトでtextareaに一番新しい情報が入るようにしたいのです。valueで指示したのですがJavaScriptが邪魔してブラウザに反映されません。ソースを見るとvalue="********"とはいっています。

my.cgiを呼び出す命令を記述したmy.jsというファイルを作ってサブルーチンのように扱うという方法も考えているのですが、呼び出しやindex.htmlに表示させる記述の仕方が分かりません。
どなたか分かる方は、どうぞ宜しくお願いいたします。

Aベストアンサー

> valueで指示したのですがJavaScriptが邪魔してブラウザに反映されません。
JavaScriptが邪魔なら、ブラウザの設定でJavaScriptを切ればいいのでは?
> ソースを見るとvalue="********"とはいっています。
textareaにはvalueは使いません。
<textarea>********</textarea>
HTMLの文法を見直してみてください。

> デフォルトでtextareaに一番新しい情報が入るようにしたいのです。
「SSI」で検索してみてください。
index.htmlの書き方はこんな感じです。
<textarea><!--#include virtual="my.cgi" --></textarea>

> my.cgiを呼び出す命令を記述したmy.jsというファイルを作ってサブルーチンのように扱うという方法も考えているのですが、呼び出しやindex.htmlに表示させる記述の仕方が分かりません。
もしこの方法をされるのであれば、my.cgiの書き方もJavaScriptもSSIのものとは全く異なります。(SSIにJavaScriptは使いません)
BBSで説明できるほど短くないので「Ajax」で検索してください。

> valueで指示したのですがJavaScriptが邪魔してブラウザに反映されません。
JavaScriptが邪魔なら、ブラウザの設定でJavaScriptを切ればいいのでは?
> ソースを見るとvalue="********"とはいっています。
textareaにはvalueは使いません。
<textarea>********</textarea>
HTMLの文法を見直してみてください。

> デフォルトでtextareaに一番新しい情報が入るようにしたいのです。
「SSI」で検索してみてください。
index.htmlの書き方はこんな感じです。
<textarea><!--#include virt...続きを読む

Qサブルーチンへの引数

フォーム内のチェックボックスすべてを一括でチェックする関数を作成しています。
JavaScript関数を呼び出す際の引数の受け渡し方について質問です。
以下のようなソースで、関数を呼び出した場合、
alert(frmName)の時には"xxxxx"と表示されますが、
document.frmName.elements[i].checked = true;
の時には、変数展開されずに、"frmName"として処理されているようです。

変数ではなく、フォームのname属性値を直接記述すると動作します。

エラーメッセージは
「コード:0
エラー:'document.frmName.elements' は Null またはオブジェクトではありません。」
となっています。

何か解決方法はありますでしょうか?

----JavaScript部分
//全てのチェックボックのチェックをON
function chBxOn(frmName){
alert(frmName);
for (var i=0; i<document.frmName.elements.length; i++){
document.frmName.elements[i].checked = true;
}
----
関数呼出部分
<form name="xxxxx">
<a href="javascript:chBxOn('xxxxx')">ON</a>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
</form>

フォーム内のチェックボックスすべてを一括でチェックする関数を作成しています。
JavaScript関数を呼び出す際の引数の受け渡し方について質問です。
以下のようなソースで、関数を呼び出した場合、
alert(frmName)の時には"xxxxx"と表示されますが、
document.frmName.elements[i].checked = true;
の時には、変数展開されずに、"frmName"として処理されているようです。

変数ではなく、フォームのname属性値を直接記述すると動作します。

エラーメッセージは
「コード:0
エラー:'document.frmName....続きを読む

Aベストアンサー

for (var i=0; i<document.forms[frmName].elements.length; i++){
document.forms[frmName].elements[i].checked = true;
}

Qjavascriptの長いコードをサブルーチン化する方法

初歩的な質問かもしれませんが

<a href="javascript:void(0);" onclick="window.open
('note.htm','_blank','location=no,menubar=no,scrollbars=yes,
resizable=yes,status=no,width=200,height=100,top=0,left=0')">※注釈※</a>

…というHTMLをたくさんの箇所に挿入したいのですが,これではあまりにも長い
ので,該当ファイルのヘッダ内に

<head>
<SCRIPT language="javascript" type="text/javascript" src="../script/winopen.js"></script>
</head>

みたいにwinopen.jsとして収め,必要箇所で呼び出したいのですが,
(1) winopen.jsファイル内 と
(2) HTMLの<body></body>内 には
具体的にどのように記述したらよいものでしょうか?

初歩的な質問かもしれませんが

<a href="javascript:void(0);" onclick="window.open
('note.htm','_blank','location=no,menubar=no,scrollbars=yes,
resizable=yes,status=no,width=200,height=100,top=0,left=0')">※注釈※</a>

…というHTMLをたくさんの箇所に挿入したいのですが,これではあまりにも長い
ので,該当ファイルのヘッダ内に

<head>
<SCRIPT language="javascript" type="text/javascript" src="../script/winopen.js"></script>
</head>

みたいにwinopen.jsとして収め,必要箇所...続きを読む

Aベストアンサー

リンクごとに違うのはURLだけでウィンドウの大きさその他は全て同じだとして。

==winopen.js==
function myOpen(url) {
window.open(url,'_blank','location=no,menubar=no,scrollbars=yes,
resizable=yes,status=no,width=200,height=100,top=0,left=0');
}

==HTML リンクの部分==
<a href="~url~" onclick="myOpen(this.href)">※注釈※</a>

html部分をさらに短くすることも可能ですがこの程度が妥当だと思います。
(Javascript-offでも普通のリンクとして機能するし、普通のリンクとして機能するようにしておけば検索エンジンもリンク先を拾ってくれます。)


人気Q&Aランキング

おすすめ情報