Javascript学習ノート4 Eval関数

5789 ワード

evalの役割は実はとても簡単です.この文字列をJS解釈器に渡し、Javascript解釈器によってこの文字列をJavascriptコードと解釈して実行します.
一番簡単な例を挙げます.
 
  
<br>eval("alert(1+1)"); <br>
とても簡単で、文字列をJSコードに解釈して実行して、2を弾きます.
もちろん、上の例はただのおもちゃです.実際にこんなに馬鹿にする人はいません.皆さんの基本的なeval関数はDOMの中にあるべきです.例えば、div 1、div 2、div 3があります.それでは、document.getElementByIDの時に私達のIDは入手できません.一番簡単な方法はforサイクルの中でevalを使ってこのようなプログラムをつづり合わせます.例えば、
 
  
<br>for (var loop = 1; loop < 10; loop++) { <br>eval('document.getElementById("div"+loop).innerHTML="123"'); <br>} <br>
基本的な使い方を言い終えても、まだこの関数に対する意味が尽きないと信じています.この関数がこのような使い方しかないと、つまらないです.少しずつeval関数を切り開きます.
まずevalのスコープから話します.まずこのような関数を見ます.
 
  
<br>eval("var i=3"); <br>alert(i); <br>
コードは簡単です.結果としてポップアップできます.このコードを次に比較します.
 
  
<br>var test = function () { <br>eval("var i=3"); <br>alert(i); <br>} <br>test(); <br>alert(i); <br>
その結果、まず3を弾いて、次にundefinedです.
説明:eval()関数が動的に実行するコードは、新しいスコープを作成しません.コードは現在のスコープで実行されます.つまり、eval関数は、現在のスコープのthis、argmentなどのオブジェクトを完全に使用することができます.
IEでは、eval()と非常に類似した関数をサポートすることをexecScript()という.簡単なコードを書いてもいいです.
 
  
<br>var test = function () { <br>execScript("var i=3"); <br>alert(i); <br>} <br>test(); <br>alert(i); <br>
その結果、2つの3つの3つがポップアップされました.これはexecScript関数の特徴を見抜きました.まず彼はevalと似ています.すべての文字列をJSコードと解釈して実行できますが、彼の役割領域は現在の役割領域ではなく、グローバルな役割領域です.上のコードをFirefoxとGoogleブラウザに置いて試してみます.Firefox上のexecScript上のコードが無効であることを発見しました.それでは問題を説明します.execScriptコードのブラウザの互換性に問題があります.
この二つの関数の「長所」をどうやってまとめられますか?つまり、グローバル+ブラウザの互換性.インターネットで検索したら、自分でまとめてくれました.
 
  
<br>var StrongEval = function (code) { <br>if (window.navigator.userAgent.indexOf("MSIE") >= 1) { <br>execScript(code); <br>} <br>if (window.navigator.userAgent.indexOf("Firefox") >= 1) { <br>window.eval(code); <br>} <br>else { <br>execScript(code); <br>} <br>}; <br>var Test = function () { <br>StrongEval("var i=3"); <br>} <br>Test(); <br>alert(i); <br>
このようにFFとIEを完璧に両立させることができます.その本質的なコードはFFの中でevalとwindow.evalが等価ではないことです.これは素晴らしいことです.
また、eval+withを使って、いくつかの奇淫技術を実現することもできます.
私たちは普通の意味でこのようなコードを書くことができます.
 
  
var obj = function () {
this.a = 1;
this.b = 2;
this.c = 5;
this.fun = function () {
this.c = this.a + this.b;
}
};
var o = new obj();
o.fun();
alert(o.c);
またはそうです
 
  
var obj = {
a: 1,
b: 2,
c: 5,
fun: function () {
this.c = this.a + this.b;
}
}
またはそうです.
 
  
var obj = function () {
this.a = 1;
this.b = 2;
this.c = 5;
};
obj.prototype.fun = function () {
this.c = this.a + this.b;
}
var o = new obj();
o.fun();
alert(o.c);
いずれにしても、あなたはこのようなthisにうんざりしていますか?私たちはとても変わった方法を取りましょう.少なくとも感覚的には少し楽になるかもしれません.
 
  
<br>var funtemp = function () { <br>c = a + b; <br>} <br>var obj = { <br>a: 1, <br>b: 2, <br>c: 5 <br>}; <br>var fun; <br>with (obj) { <br>eval("fun = " + funtemp); <br>} <br>fun(); <br>alert(obj.c); <br>
これは無理です.それではいいです.何を議論しないで見ても気持ちが悪いです.このような状況について議論します.
 
  
<br>var DBCommon = function () { <br>alert("1."); CreateConnection(); <br>alert("2."); OpenConnection(); <br>alert("3."); CreateCommand(); <br>alert("4."); ExcuteCommand(); <br>alert("5."); CloseConnection(); <br>} <br>var SQLServerCommon = { <br>CreateConnection: function () { alert(" SQL Server "); }, <br>OpenConnection: function () { alert(" SQL Server "); }, <br>CreateCommand: function () { alert(" ¨SQL Server "); }, <br>ExcuteCommand: function () { alert(" DSQL Server "); }, <br>CloseConnection: function () { alert(" SQL Server "); } <br>}; <br>var OracleCommon = { <br>CreateConnection: function () { alert(" ¢Oracle "); }, <br>OpenConnection: function () { alert(" aOracle "); }, <br>CreateCommand: function () { alert(" ¨Oracle "); }, <br>ExcuteCommand: function () { alert(" DOracle "); }, <br>CloseConnection: function () { alert(" ?Oracle "); } <br>}; <br>with (SQLServerCommon) { <br>eval("forSQLServer=" + DBCommon); <br>} <br>with (OracleCommon) { <br>eval("forOracle=" + DBCommon); <br>} <br>forSQLServer(); <br>forOracle(); <br>
私たちはこれを粗末なテンプレートのパターンと見なしてもいいですか?へへ.私たちはこれをevalとwithの配合を利用して関数の文脈を変えるということもできます.
また、Evalは一般的にはあまり使われていません.私たちは完全に避けられます.