eval の機能は実際には非常に単純で、文字列を JS インタープリターに渡し、JavaScript インタープリターがその文字列を Javascript コードに解釈して実行します。 最も単純な例を見てみましょう: コードをコピーします コードは次のとおりです: <br>eval("alert(1 1)"); <br>script> <br> </div> <br> 文字列を解釈します。 JS へ コードが実行され、2 がポップアップ表示されます。 <br><br>もちろん、上記の例は単なるおもちゃであり、実際に使用するほど愚かな人はいないでしょう。 eval 関数を使用する最も基本的な方法は、DOM 内で行うことだと思います。たとえば、div1、div2、div3 がある場合、document.getElementByID を使用するときに ID を取得する方法はありません。このようなプログラムを結合するには eval を使用します。例: <br><div class="codetitle"> <span><a style="CURSOR: pointer" data="66004" class="copybut" id="copybut66004" onclick="doCopy('code66004')"><u>コードをコピー</u></a></span> コードは次のとおりです:</div> <div class="codebody" id="code66004"> <br><script type=" text/javascript "><BR>for (var ループ = 1; ループ <10; ループ ) { <BR>eval('document.getElementById("div" ループ).innerHTML="123"'); <BR>} <BR>script> <br> </div> <br>最も基本的な使い方を説明した後、この関数がこのような使い方しかない場合、誰もがこの関数に興味を持つと思います。次に、eval() 関数を少しずつ見てみましょう。 <br><br> まずは eval のスコープからこの関数を見てみましょう: <br><div class="codetitle"> <span><a style="CURSOR: pointer" data="43977" class="copybut" id="copybut43977" onclick="doCopy('code43977')"><u>コードをコピー</u></a></span> コードは次のとおりです: </div> <div class="codebody" id="code43977"> <br><script type="text/javascript"> <br>eval("var i=3"); <br><br> <br>コードは非常に単純で、結果がポップアップ表示されます。次に、このコードを比較します。 </div> <br><br><div class="codetitle"> <span>コードをコピー <a style="CURSOR: pointer" data="83498" class="copybut" id="copybut83498" onclick="doCopy('code83498')"><u></u> コードは次のとおりです: </a></span> </div><script type ="text/javascript"> <div class="codebody" id="code83498">var test = function () { <br>eval("var i=3") <br>alert(i); ; <br>alert(i); <br>script> <br><br> <br>結果は、最初に 3 が表示され、次に未定義になります。 <br><br>次に説明します。eval() 関数によって動的に実行されるコードは新しいスコープを作成せず、そのコードは現在のスコープで実行されます。つまり、 eval() 関数は、現在のスコープ内の this、引数、および他のオブジェクトも使用できます。 </div> <br>IE では、eval() によく似た関数 execScript() がサポートされています。簡単なコードを書くことができます。 <br><br><br><br><br>コードをコピー<div class="codetitle"> <span><a style="CURSOR: pointer" data="64936" class="copybut" id="copybut64936" onclick="doCopy('code64936')"> コードは次のとおりです:<u></u> </a><script type="text/javascript "> </span>var test = function () { </div>execScript("var i=3"); <div class="codebody" id="code64936">alert(i); <br>} <br>test(); <br>alert( i); <br>script> <br><br> <br>結果は 2 つの 3 が表示されます。これは、execScript 関数の特徴を示しています。まず、これは eval と似ており、文字列を解釈できます。を JS コードに変換して実行しますが、そのスコープは現在のスコープではなく、グローバル スコープです。上記のコードを Firefox と Google Chrome に入れて試してみると、execScript のコードが Firefox では無効であることがわかります。これは、execScript コードのブラウザ互換性にも問題があることを示しています。 <br><br>すると、これら 2 つの機能、つまりブラウザーのグローバル互換性の「利点」をどのように組み合わせることができるかという疑問が生じます。ネットで調べて自分でまとめてみるとこんな感じです: </div> <br><br><br><br>コードをコピー <div class="codetitle"> <span><a style="CURSOR: pointer" data="47182" class="copybut" id="copybut47182" onclick="doCopy('code47182')"> コードは次のとおりです: <u></u> </a><script type="text/javascript"> </span>var StrongEval = function (code) { </div>if (window.navigator.userAgent.indexOf("MSIE") >= 1) { <div class="codebody" id="code47182">execScript(コード); <br>} <br>if (window.navigator.userAgent.indexOf("Firefox") >= 1) { <br>window.eval(コード); <br>else { <br>execScript(code); <br>} <br>}; <br>var Test = function () { <br>StrongEval("var i=3"); 🎜> テスト(); <br>アラート(i)> <br><br><br>これは FF と IE と完全に互換性があります。重要なコードは、FF では eval と window.eval が同等ではないということです。これは非常に奇妙なことです。 <br><br>さらに、 eval を使用して、いくつかの奇妙なトリックを実現することもできます。 <br><br>一般的な意味では次のようなコードを書くことができます: <br><div class="codetitle"> <span><a style="CURSOR: pointer" data="73885" class="copybut" id="copybut73885" onclick="doCopy('code73885')"><u>コードをコピー</u></a></span> コードは次のとおりです:</div> <div class="codebody" id="code73885"> <br>var obj = function () { <br>this.a = 1; <br>this.b = 2; <br>this.fun = 関数() { <br>this.c = this.a this.b; <br>} <br>var o = new obj() <br>alert; (o.c ; <br>var obj = { <br>a: 1, <br>b: 2, <br>c: 5, </div>fun: function () { <br>this.c = this.a this.b ; <br>} <div class="codetitle">} <span><a style="CURSOR: pointer" data="93775" class="copybut" id="copybut93775" onclick="doCopy('code93775')"> <u>またはこれ: </u></a></span> </div> <div class="codebody" id="code93775">コードをコピー<br><br><br>コードは次のとおりです。 <br><br> <br>var obj = function () { <br>this.a = 1; <br>this.c = 5; <br>obj.prototype.fun = function () { </div>this.c = this.a this.b; <br>} <br>var o = new obj(); () ; <div class="codetitle">alert(o.c); <span><a style="CURSOR: pointer" data="60663" class="copybut" id="copybut60663" onclick="doCopy('code60663')"> <u>何にしても、これにはうんざりしていますか?次に、少なくとも感覚にとってより快適になるように、まったく異なるアプローチを採用してみましょう。 </u></a></span> </div> <div class="codebody" id="code60663">コードをコピー<br><br><br> コードは次のとおりです:<br><br> <br><script type="text/javascript "> <br>var funtemp = function () { <br>c = a b; <br>} <br>var obj = { <br>a: 1, <br>b: 2, </div>c: 5 <br>}; <br>with (obj) { <div class="codetitle">eval("fun = " funtemp); <span>alert(obj. c); <a style="CURSOR: pointer" data="59999" class="copybut" id="copybut59999" onclick="doCopy('code59999')">script> <u></u> </a>これは非常に強制的なものなので、快適かどうかについては議論しません。そのような状況について話し合いましょう。 </span> </div> <div class="codebody" id="code59999"> <br><br>コードをコピー<br><br><br> コードは次のとおりです。<br><br> <br><script>var DBCommon = function ( ) { <br>alert("1."); <br>alert("3."); <br>alert("4."); <br>alert("5."); <br>} <br>var SQLServerCommon: function () alert(" SQL Server 接続を確立します"); }, <br>OpenConnection: function () { alter("SQL Server 接続を開きます") }, <br>CreateCommand: function () { alter("SQL を作成します)サーバー コマンド"); }, <br>ExcuteCommand: function () {alert("DSQL サーバー コマンドの実行"); }, </div>CloseConnection: function () { alter("SQL Server 接続を閉じる"); } <br>}; <br>var OracleCommon = { <div class="codetitle">CreateConnection: function () {alert("Oracle 接続を確立する"); }, <span>OpenConnection: function () {alert("Oracle 接続を開く"); }, <a style="CURSOR: pointer" data="35432" class="copybut" id="copybut35432" onclick="doCopy('code35432')">CreateCommand : function () {alert("Oracle コマンドの作成") }, <u>ExcuteCommand: function () {alert("DOracle コマンドの実行") }, </u>CloseConnection: function ( ) { アラート("?Oracle 接続を閉じる"); } </a>}; </span>with (SQLServerCommon) { </div>eval("forSQLServer=" DBCommon); <div class="codebody" id="code35432">with (OracleCommon) <br>eval(" forOracle=" DBCommon); <br>forSQLServer(); <br>script><br><br> <br>単純なテンプレート メソッド パターンについてはどうでしょうか?ふふ。 eval と with を使用してこれを呼び出して、関数のコンテキストを変更することもできます。 <br><br>しかし、繰り返しになりますが、Eval は一般的な状況ではほとんど使用されず、完全に使用を避けることができます。 <br> </div> </div>