mozilla
Your Search Results

    eval()

    This translation is incomplete. Please help translate this article from English.

    概要

    特定のオブジェクトを参照すること無く JavaScript コードの文字列を評価します。

    コア・グローバルメソッド
    実装されたバージョン JavaScript ?
    ECMAScript エディション ECMAScript ?

    構文

    eval(string [, object]) 

    引数

    string
    式、ステートメント、又は一連のステートメントを表す文字列です。式は、存在するオブジェクトの変数及びプロパティを含むことが出来ます。
    object
    オプショナルな引数。もし指定されたら、評価は指定されたオブジェクトのコンテキストに限定されます。
    注記: eval の第二引数はなくなりました。バグ 442333 を参照してください。

    説明

    eval はトップレベル関数であり、どのオブジェクトにも関連付けられていません。

    eval 関数の引数は文字列です。もし文字列がひとつの式に相当するなら、 eval は式を評価します。もし引数が 1 つ以上の JavaScript ステートメントに相当するなら、 eval はステートメントとして機能します。算術式を評価するために eval を呼ばないでください。 JavaScript は算術式を自動的に評価します。

    もし文字列として算術式を構成するなら、後でそれを評価するために eval を使用することができます。 例えば、 x という変数があるとします。ある変数に "3 * x + 2" のような式の文字列値を代入し、そしてスクリプトの後方で eval を呼ぶことで、 x が関わる式の評価を後回しにすることができます。

    もし eval の引数が文字列でないなら、 eval は引数を変更しないで返します。 次の例は、String コンストラクタが指定され、eval は文字列を評価するのではなく String オブジェクトを返します。

    eval(new String("2 + 2")); // returns a String object containing "2 + 2"
    eval("2 + 2");             // returns 4
    

    この制約は、一般的なやり方では toString を使用することで回避できます。

    var expression = new String("2 + 2");
    
    eval(expression.toString());
    

    eval 関数を eval 以外の名前によって呼び出すことで間接的に使用することは出来ません。もしそうすると、ランタイムエラーが発生するでしょう。例えば、次のコードを使用するべきではありません。

    var x = 2;
    var y = 4;
    var myEval = eval;
    
    myEval("x + y");
    

    eval を使わないでください!

    eval() は、呼び出した者の権限と共に渡されたコードを実行する危険な関数です。もし eval() を悪意ある者の影響を受けたかもしれない文字列とともに実行すると、終には webpage / extension のパーミッションで、ユーザーのマシン上で悪意あるコードを実行する羽目になるかもしれません。

    eval() はまた他の多くのコンストラクトが現代の JS エンジンにより最適化されているのと違い、JS インタプリタを呼び出すため、一般に代替手段より低速です。

    普遍的なユースケース向けに、eval() の安全(かつ高速)な代案があります。

    メンバのプロパティにアクセスする

    プロパティのプロパティ名を変換するために eval を使用するべきではありません。次の例に注意してください。getFieldName(n) 関数は指定された form 要素の名前を文字列として返します。最初のステートメントは3番目の form 要素の 文字列値を変数 field に代入します。2番目のステートメントは form 要素の値を表示するために eval を使用します。

    var field = getFieldName(3);
    document.write("The field named ", field, " has value of ",
       eval(field + ".value"));
    

    しかし、 eval はここでは必要ありません。と言うよりも、ここで使用することはお勧めしません。 代わりに、より高速な メンバ演算子 を使用してください。

    var field = getFieldName(3);
    document.write("The field named ", field, " has value of ",
       field[value]);
    

    Use functions instead of evaluating snippets of code

    JavaScript は関数を他の API の引数にしたり、変数に保存したりオブジェクトのプロパティにできる first-class functions を持っています。 多くの DOM API はこの精神で作られているので、次のように書けます(書くべきです):

    setTimeout(function() { ... }, 1000); // instead of setTimeout(" ... ", 1000);
    
    elt.addEventListener("click", function() { ... } , false); // instead of elt.setAttribute("onclick", "...");
    

    Closures are also helpful as a way to create parametrized functions without concatenating strings.

    JSON の構文解析(文字列を JavaScript objects に変換)

    データ文字列 (例、配列: "[1, 2, 3]")の変換のため eval() を使おうと思ってるなら、 JSON に切り替えるべきです。 Downloading JSON and JavaScript in extensions を参照してください。

    Note that since JSON syntax is limited compared to JavaScript syntax, many valid JavaScript literals will not parse as JSON. For example, trailing commas are not allowed in JSON, and property names (keys) in object literals must be enclosed in quotes. Be sure to use a JSON serializer to generate the string, that will be later parsed as JSON.

    Pass data instead of code

    For example, an extension designed to scrape contents of web-pages could have the scraping rules defined in XPath instead of JavaScript code.

    Run code with limited privileges

    If must run code, consider running it with reduced privileges. This advice applies mainly to to extensions and XUL applications, which can use Components.utils.evalInSandbox for this.

    実装間の互換性

    eval への 2 番目のオプショナルな引数は非標準であり、全ての JavaScript 実装でサポートされてはいないことに注意してください。これを書いた時点で(訳者注:英語版執筆時点)、例えば、 Rhino も、また Safari の JavaScriptコアもこれをサポートしません。

    Note: eval の第二引数はなくなりました。バグ 457068 を参照してください。

    実装をまたいで互換性を維持するために、eval の第二引数は使用されないことが推奨されます。同じ効果を得るために、 with ステートメント が使われることがあります。

    eval(string, object);
    

    を使用するよりも

    with (object) {
      eval(string);
    }
    

    のように。

    次の例は document.write を使用して出力を表示します。サーバ側 JavaScript では、document.write の代わりに write 関数を呼ぶことで同じ出力を表示することが出来ます。

    例: eval を使う

    次のコードでは、eval を含むどちらのステートメントも 42 を返します。最初のものは文字列 "x + y + 1" を評価します。2 番目のものは文字列 "42" を評価します。

    var x = 2;
    var y = 39;
    var z = "42";
    
    eval("x + y + 1"); // returns 42
    eval(z);           // returns 42 
    

    例: JavaScript ステートメントの文字列を評価するために eval を使う

    次の例は、文字列 str を評価するために eval を使用します。この文字列は Alert ダイアログボックスを開き、もし x が 5 なら z に 42 を代入し、さもなくば z に 0 を代入する JavaScript ステートメントで構成されます。2番目のステートメントが実行された時、eval はそれらのステートメントを機能させ、またステートメントの集合を評価して z に代入される値を返します。

    var x = 5;
    var str = "if (x == 5) {alert('z is 42'); z = 42;} else z = 0; ";
    
    document.write("<P>z is ", eval(str));
    

    戻り値

    eval は最後に評価された式の値を返します。

    var str = "if ( a ) { 1+1; } else { 1+2; }";
    var a = true;
    var b = eval(str);  // returns 2
     
    alert("b is : " + b);
    
    a = false;
    b = eval(str);  // returns 3
    
    alert("b is : " + b);
    

    関連情報

    ドキュメントのタグと貢献者

    Contributors to this page: Potappo, teoli, ethertank, Hfjapancom, masahal
    最終更新者: teoli,
    サイドバーを隠す