スタートページJavascript関数への引数渡し

数式を文字列引数として渡す

y=f(x) のグラフを描く、f(x)=0の根を求めるというようなプログラムでは、関数 f(x) を動的に生成できると便利です。ここでは、f(x)の数式を文字列の引数として渡すことにより、関数 f(x) を定義することを対象にします。


例1:f(x) の指定(関数から)

f(x) = 3*(x+2) の "3*(x+2)" を文字列として関数 f(x) に渡して f(x) を定義します(行D)。そして f(1) ととして、関数 f(x) は f(1) = 3*(1+2) = 6 を計算させます。
 次に、f(x) = Math.sqrt(x) に定義し直し、f(4) = Math.sqrt(4) = 2 を計算させます。
 このように、「数式が変わっても f(x) のプログラムを変更する必要がない」というのが、ここのポイントです。

    function 例1() {
        var 数式;                 // 行A:数式をグローバル変数とする
        function f(x) {           // 行B:f(x) はメイン関数の内部に記述
            return eval(数式);    // 行C:eval() にする必要がある
        }
        数式 = "3*(x+2)";         // 行D:数式を文字式で与える
        var y = f(1);             // 行E:f(1) を求める
          alert("f(x)=" + 数式 + ", f(1) = " + y);
        数式 = "Math.sqrt(x)";    // 行F:数式を変更する
        y = f(4);
          alert("f(x)=" + 数式 + ", f(4) = " + y);
    }

例2:f(x) の指定(form から)

form 画面から f(x) を指定したいことが多くあります。次のプログラムは、、任意の数式とxの値をを入力して f(x) の値を表示するものです。

    function 例2() {
        function f(x) {
            return eval(数式);
        }
        var 数式 = document.フォーム.入力数式.value;           // 行G
        var x = eval(document.フォーム.入力X値.value);        // 行H
        var y = f(x);
        alert("f(x)=" + 数式 + ", f(" + x + ") = " + y);
    }
       :
    <form name="フォーム">
        <p>f(x)=<input name="入力数式" type="text" size="30" value="3*(x+2)"></input>
        x=<input name="入力X値" type="text" size="5" value="1"></input>
        <input type="button" value="実行" onClick="例2()" ></input></p>
    </form>

f(x)= x=

例1では、行Aで「数式」をグローバル変数として定義し、行Dで数式を文字列としました。
 それに対して例2では、フォームで「入力数式」として与え、それを行Gで「数式」としています。この場合も「数式」をグローバル変数にしておく必要があります。

さらに、例2では x の値をフォームの「入力X値」で入力し、行Hで x にしています。
このとき、eval にしているのは、「入力X値」で「4」の代わりに「1+3」などでもよいようにするためです。 x は関数 f(x) へ引数として渡されるので、グローバル変数にする必要はありません。

例3:多変数、パラメタがある場合

例3では、例1を拡張して、f(x,y) = a*x+ y (x, y は変数、a はパラメタ)としました。
 a を、a = 1, 2 と変化させ、それぞれの f(1, 1) を表示させています。

    function 例3() {
        var 数式;
        var a;                          // 行I:パラメタもグローバル変数にする
        function f(x, y) {
            return eval(数式);
        }
        数式 = "a*x+y";
        var パラメタ配列 = new Array();  // 行J:パラメタ配列の設定
          パラメタ配列[0] = 1; パラメタ配列[1] = 2;
        for (var i = 0; i < 2; i++) {
            a = パラメタ配列[i];         // 行K:パラメタ a の設定
            z = f(1,1);                  // 行L:z = a*x +y の計算
            alert("f(x,y)=" + 数式 + ", a=" + a + ", f(1,1) = " + z);
        }
    }

変数 x, y は関数 f(x, y) に引数で渡されますが、パラメタ a は「数式」と同様に、関数 f(x, y) の定義に使われるので、行Iでグローバル変数としておく必要があります。

一般にパラメタは配列にすることが多いでしょう。ここでは、行Jでパラメタ配列を設定しておき、行Kで f(x,y) に渡す a にその要素を入れて、行Lで計算しています。

行Iで var a = new Array(); として値を入れておけば、「パラメタ配列」などは不要になりそうですが、うまくいかないのです。「数式」が "a[i]*x+y となるので、 i もグローバル変数にする必要があります。かえって扱いにくくなります。