■関数を合成する方法
※ ・・・ このページの内容は,すべての数式表示関数の作り方に影響します.今までに作った関数は,実用版では,以下の内容を踏まえて書き換えた方がよいでしょう.
◇分数から繁分数を合成する例◇ Frac(bunshi, bunbo)という関数で分数が表示できるものとします. 例1 Frac('2','3');で3分の2が表示できます. 例2 Frac('4','5');で5分の4が表示できます. このとき,分子が3分の2で,分母が5分の4となる繁分数を表示するにはどうすればよいか. Frac('第1引数','第2引数');が第1引数と第2引数に書かれた文字列を表示する関数である限り, Frac('Frac(2,3)','Frac(4,5)'); は下に書いた例のようになり、目的としている繁分数とはなりません. そこで 右の例で言えば,Frac(2,3)という分子の位置に,関数の名前ではなく「分数を表わすタグなどの制御文字を代入する」ことを考えます. 関数の戻り値 関数 function abc(p1, p2, ...) { return (xx); } は,関数を呼び出した場所に xx で示される値を返します(代入します).特に,この戻り値 xx として文字列が使われているときは,文字列が返されます. 右の例のように,画面に文字や制御用のタグを出力するように作成した関数を作り変えて,その同じ内容を文字列として返す関数とすると 1 他の関数にその関数が作成した文字列を渡すことができます. 2 この関数を直接呼び出しても,画面上何も起こりませんが,本来なすべき画面表示は document.write('関数名()'); で実現できます. 3 直接呼び出し,間接呼び出しとも頻繁に使うときは,関数を2種類も作るとメンテが大変なので,間接呼び出し・代入用の関数 cVec1()などを1つ作成し,これを引用して function Vec1(p1, p2,p3.,) { document.write( cVec() ); } とすれば毎回document.write('');と書く必要がなくなるばかりでなく,この関数を実行すれば間接呼び出し関数のチェックも行えるので一石二鳥です. |
例1 例2 ・・・・> 合成すれば |
例 function Vec1(shiki) {document.write('<span styale="">'); dcocument.write('......'); } という関数が次の形で呼び出されたときに,ベクトルを表示するのは,document.write('..');と書かれているからです. <Script Language="JavaScript">Vec1('a');</Script> この関数を function cVec1(shiki) //c はただの目印 { str1 = ""; //文字列を貯える変数を作成 str1 += '<span style=" ">';//順次足していく str1 += '.....'; return ( str1 );//順次足された文字列全体を返す } に変えることを考えます. |
|
◇合成可能な関数への書き換え例◇ 次の関数はベクトルを表示する関数で,このままでは分数の分子に代入することはできません. function Vec1(shiki, haba) { document.write('<span style="position:relative;">'); //current position の取得 if(haba == null || haba == '') mojisuu = shiki.length; //第2引数がなければ,文字数を自動計算する. else mojisuu = parseInt(haba); for(kk = 0; kk < mojisuu; kk++) document.write('<span style="position:absolute; left:'+(kk * 8)+'px; top:1px;font-family:Comic Sans MS; font-size:8px; font-weight:medium;">─</span>'); document.write('<span style="position:absolute; left:'+(mojisuu*8 -2)+'px; top:-3px;font-family:Comic Sans MS; font-size:10px; font-weight:medium; ">></span>'); //> は不等号の>のマーク,→でもよい document.write('<span style="position:absolute; left:0px; top:2px; font-size:16px;font-family:Comic Sans MS; font-weight:medium;">'+ shiki +'</span>'); document.write('</span>'); //current position への復帰 for(kk = 0; kk < mojisuu; kk++) document.write('<span style="position:relative; visibility:hidden;font-size:16px;">w</span>');//文字送り調整 } この関数を次のように書き換えます.(各行の先頭だけでなく末尾の括弧も変えています.) function cVec1(shiki, haba) {str1 = ""; //文字列を貯える変数 str1 += '<span style="position:relative;">'; //current position の取得 if(haba == null || haba == '') mojisuu = shiki.length; //第2引数がなければ,文字数を自動計算する. else mojisuu = parseInt(haba); for(kk = 0; kk < mojisuu; kk++) str1 += '<span style="position:absolute; left:'+(kk * 8)+'px; top:1px;font-family:Comic Sans MS; font-size:8px; font-weight:medium;">─</span>'; str1 += '<span style="position:absolute; left:'+(mojisuu*8 -2)+'px; top:-3px;font-family:Comic Sans MS; font-size:10px; font-weight:medium; ">></span>'; //> は不等号の>のマーク,→でもよい str1 += '<span style="position:absolute; left:0px; top:2px; font-size:16px;font-family:Comic Sans MS; font-weight:medium;">'+ shiki +'</span>'; str1 += '</span>'; //current position への復帰 for(kk = 0; kk < mojisuu; kk++) str1 += '<span style="position:relative; visibility:hidden;font-size:16px;">w</span>';//文字送り調整 return ( str1 ); } 直接呼び出し用の関数は間接呼び出し用関数の単なる引用です. function Vec1(shiki, haba) {document.write( cVec(shiki, haba) ); //引用符は使いません(引用符を入れると単なる文字になります). } 他の関数に代入するときは cVec1() を,直接呼び出すときは Vec1() を使います. |
|
※ 以上の内容は,すべての数式表示関数の作り方に影響します.今までに作った関数は,実用版では,この内容を踏まえて書き換えた方がよいでしょう. | |
例 分数を表示する関数がcFrac_101(), 及び Frac_101()でベクトルを表示する関数がcVec_102()およびVec_102()のとき ( アンダーバー以下は,単なるバージョン番号) 右のように表示するには <Script Language="JavaScript">Vec_102('m');</Script> = <Script Language="JavaScript">Frac_101(cVec_102('a') + '+ ' + cVec_102('b'), '2', '', 4,4,1);</Script> ※ 分子に + という文字を入れるためには,分子に代入するものは cVec_102('a') + cVec_102('b') ではなく cVec_102('a') + '+ ' + cVec_102('b') である点に注意しましょう. |
= |