Javascript学習ノート4 Eval関数
5789 ワード
evalの役割は実はとても簡単です.この文字列をJS解釈器に渡し、Javascript解釈器によってこの文字列をJavascriptコードと解釈して実行します.
一番簡単な例を挙げます.
もちろん、上の例はただのおもちゃです.実際にこんなに馬鹿にする人はいません.皆さんの基本的なeval関数はDOMの中にあるべきです.例えば、div 1、div 2、div 3があります.それでは、document.getElementByIDの時に私達のIDは入手できません.一番簡単な方法はforサイクルの中でevalを使ってこのようなプログラムをつづり合わせます.例えば、
まずevalのスコープから話します.まずこのような関数を見ます.
説明:eval()関数が動的に実行するコードは、新しいスコープを作成しません.コードは現在のスコープで実行されます.つまり、eval関数は、現在のスコープのthis、argmentなどのオブジェクトを完全に使用することができます.
IEでは、eval()と非常に類似した関数をサポートすることをexecScript()という.簡単なコードを書いてもいいです.
この二つの関数の「長所」をどうやってまとめられますか?つまり、グローバル+ブラウザの互換性.インターネットで検索したら、自分でまとめてくれました.
また、eval+withを使って、いくつかの奇淫技術を実現することもできます.
私たちは普通の意味でこのようなコードを書くことができます.
また、Evalは一般的にはあまり使われていません.私たちは完全に避けられます.
一番簡単な例を挙げます.
<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は一般的にはあまり使われていません.私たちは完全に避けられます.