eval から Function へ

作成日 : 2001-04-30
最終更新日 :

今や表計算ソフトはなくてはならないものになった。 特に Excel が強いのは承知で、 表計算ソフトの世話にはならずとも自分でできることはしたい。 そのための道具として、JavaScript を考えている。

ここでは、式を入れれば計算をするという機能を作ろう。 これには JavaScript の eval という関数があり、以前は重宝していたが、 現在はセキュリティ上の問題等により、eval ではなく他の関数を使うように勧告されている。 eval() (developer.mozilla.org) の項を参照してほしい。

ここでは、上記参照ページにあるように、Function() を使ったコードに変更している。 Function() については下記参照。

たとえば、式の欄に x * x * 3.14 と入れる。 これは半径 x の円の面積を求める式になる。 x の欄に 3 を入れて、「計算」ボタンをクリックすると、 答の欄は 28.26 となる。 この答はとりもなおさず、半径 3 の円の面積である。 これは、Excel でいう、ゴールシーク機能を実現する時の基礎技術となる。 上記で、3.14 の代わりに Math.PI と入れると、より精度の高い値が得られる。

値 ( x )

書き直し前は次の構文だった :

var x = eval(input);      // input は入力式の文字列。例:'3 * 3'
var output = eval(formula); // formula は式。例: 'x * x * 3.14'

書き直し後は次の通りである。

let s = `use "strict";const x=${input};return (${formula})`;
let output = Function(s)();

書き直した点は他にもいくつかある。

以前は JavaScript の with 構文を利用していたため、円周率に PI を、 三角関数に sin() などと書くことができた。現在、with は曖昧性をもちこむため、使用は推奨されない。 with(developper.mozilla.org) 参照。そのため、明示的に Math.PI, Math.sin() など、 Math オブジェクトを明示してほしい。

var 宣言は予期せぬ結果をもたらすことがあるので、let に変更した。 var と let, const の使い方参照。

なお、上記式のテキストでは下記の Math オブジェクトのプロパティとメソッドが使える。 ECMAScript (ECMA-262 Edition 5.1) による。

JavaScript での Math オブジェクトのプロパティ
プロパティ説明
Math.E自然対数の底 e2.7182818284590452354
Math.LN10x = 10 における 自然対数 `ln(x)` の値2.302585092994046
Math.LN2x = 2 における自然対数 `ln(x)` の値0.6931471805599453
Math.LOG2Ex = e における底が 2 の対数 `log_2 x` の値1.4426950408889634
Math.LOG10Ex = e における底が 10 の対数 `log_10 x` の値0.4342944819032518
Math.PI円周率 π3.1415926535897932
Math.SQRT1_2sqrt(1/2)0.7071067811865476
Math.SQRT2 sqrt(2)1.4142135623730951
JavaScript での Math オブジェクトのメソッド
メソッド説明備考
Math.abs(x)絶対値
Math.acos(x)arccos定義域は [0, pi]
Math.asin(x)arcsin定義域は [-pi/2, pi/2]
Math.atan(x)arctan定義域は [-pi/2, pi/2]
Math.atan2(y,x)
Math.ceil(x)
Math.cos(x)
Math.exp(x)
Math.floor(x)
Math.log(x)
Math.max([value1[, value2[, ...]]])
Math.min([value1[, value2[, ...]]])
Math.pow(x,y)
Math.random()
Math.round()
Math.sin(x)
Math.sqrt(x)
Math.tan(x)

この機能を応用した一例として、数値積分のページがある。

リンク

  • ECMAScript Language Specifitaion (www.ecma-international.org)
  • まりんきょ学問所JavaScript 手習い > eval から Funciton へ


    MARUYAMA Satosi