eval의 기능은 실제로 매우 간단합니다. 문자열을 JS 인터프리터에 전달하면 Javascript 인터프리터가 해당 문자열을 Javascript 코드로 해석하여 실행합니다.
가장 간단한 예를 들어보겠습니다.
다음과 같이 코드 코드를 복사합니다.
<스크립트 유형="텍스트/자바스크립트">
eval("경고(1+1)");
스크립트>
아주 간단합니다. 문자열을 JS 코드로 해석하고 실행하면 2가 뜹니다.
물론, 위의 예는 단지 장난감일 뿐이고, 그것을 실제로 사용할 만큼 어리석은 사람은 없을 것입니다. eval 함수를 사용하는 가장 기본적인 방법은 DOM에 있다고 생각합니다. 예를 들어 div1, div2, div3이 있는 경우 document.getElementByID를 사용할 때 ID를 얻을 수 있는 방법이 없습니다. 그러한 프로그램을 연결하려면 eval을 사용하십시오. 예를 들어:
다음과 같이 코드 코드를 복사합니다.
<스크립트 유형="텍스트/자바스크립트">
for (var 루프 = 1; 루프 < 10; 루프++) {
eval('document.getElementById("div"+loop).innerHTML="123"');
}
스크립트>
가장 기본적인 사용법에 대해 이야기한 결과, 이 기능이 단지 몇 가지 용도로만 사용된다면 너무 지루할 것입니다. 그럼 eval() 함수를 하나씩 살펴보겠습니다.
eval의 범위부터 시작하여 이 함수를 살펴보겠습니다.
다음과 같이 코드 코드를 복사합니다.
<스크립트 유형="텍스트/자바스크립트">
eval("var i=3");
경고(i);
스크립트>
코드는 매우 간단하며 결과가 팝업될 수 있습니다. 3. 다음으로 이 코드를 비교해 보세요.
다음과 같이 코드 코드를 복사합니다.
<스크립트 유형="텍스트/자바스크립트">
var 테스트 = 함수 () {
eval("var i=3");
경고(i);
}
시험();
경고(i);
스크립트>
결과적으로 3이 먼저 나타난 다음 정의되지 않습니다.
따라서 설명하십시오. eval() 함수에 의해 동적으로 실행되는 코드는 새 범위를 생성하지 않으며 해당 코드는 현재 범위에서 실행됩니다. 즉, eval() 함수는 this, 인수 및 현재 범위의 다른 객체도 사용할 수 있습니다.
IE에서는 eval()과 매우 유사한 함수인 execScript()가 지원됩니다. 간단한 코드를 작성할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
<스크립트 유형="텍스트/자바스크립트">
var 테스트 = 함수 () {
execScript("var i=3");
경고(i);
}
시험();
경고(i);
스크립트>
결과적으로 3이 2개 튀어나왔습니다. 이것도 execScript 함수의 특징을 보여줍니다. 우선 eval과 유사하지만, 문자열을 JS 코드로 해석하여 실행할 수 있지만 그 범위는 현재 범위가 아닙니다. 글로벌 범위. Firefox와 Google Chrome에서 위의 코드를 시도하면 execScript의 코드가 Firefox에서 유효하지 않다는 것을 알게 되는데, 이는 또한 execScript 코드의 브라우저 호환성에 문제가 있음을 나타냅니다.
그러면 이 두 기능의 "장점", 즉 글로벌 + 브라우저 호환성을 어떻게 결합할 수 있는지에 대한 의문이 생깁니다. 제가 온라인에서 검색해서 직접 요약했는데 아마 이렇습니다.
다음과 같이 코드 코드를 복사합니다.
<스크립트 유형="텍스트/자바스크립트">
var StrongEval = 함수(코드) {
if (window.navigator.userAgent.indexOf("MSIE") >= 1) {
execScript(코드);
}
if (window.navigator.userAgent.indexOf("Firefox") >= 1) {
window.eval(코드);
}
또 다른 {
execScript(코드);
}
};
var 테스트 = 함수 () {
StrongEval("var i=3");
}
시험();
경고(i);
스크립트>
이런 식으로 FF 및 IE와 완벽하게 호환될 수 있습니다. 필수 코드는 FF에서 eval과 window.eval이 동일하지 않다는 것입니다. 이것은 매우 이상한 일입니다.
또한 eval+with를 사용하여 몇 가지 이상한 트릭을 얻을 수도 있습니다.
일반적으로 다음과 같은 코드를 작성할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
var obj = 함수() {
this.a = 1;
this.b = 2;
this.c = 5;
this.fun = 함수 () {
this.c = this.a + this.b;
}
};
var o = 새로운 obj();
o.재미();
경고(oc);
아니면 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
var 객체 = {
답: 1,
비: 2,
씨: 5,
재미: 함수 () {
this.c = this.a + this.b;
}
}
아니면 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
var obj = 함수() {
this.a = 1;
this.b = 2;
this.c = 5;
};
obj.prototype.fun = 함수 () {
this.c = this.a + this.b;
}
var o = 새로운 obj();
o.재미();
경고(oc);
어쨌든 이 느낌이 지겹나요? 그렇다면 적어도 감각적으로는 좀 더 편안할 수 있도록 전혀 다른 접근 방식을 취해보자.
다음과 같이 코드 코드를 복사합니다.
<스크립트 유형="텍스트/자바스크립트">
var funtemp = 함수() {
c = a + b;
}
var 객체 = {
답: 1,
비: 2,
씨: 5
};
var 재미;
(obj)와 함께 {
eval("fun = " + funtemp);
}
재미있는();
경고(obj.c);
스크립트>
이것은 매우 강렬하고 너무 좋습니다. 그것이 편안해 보이는지 여부는 논의하지 않을 것입니다. 그러한 상황에 대해 논의해 봅시다.
다음과 같이 코드 코드를 복사합니다.
<스크립트>
varDBCommon = 함수() {
경고("1.");
경고("2.");
경고("3.");
경고("4.");
경고("5.");
}
var SQLServerCommon = {
CreateConnection: function () { 경고("SQL Server 연결 설정") },
OpenConnection: function () { 경고("SQL Server 연결 열기") },
CreateCommand: function () { 경고("SQL Server 명령 생성") },
ExcuteCommand: function () { 경고("DSQL 서버 명령 실행") },
CloseConnection: function () { 경고("SQL Server 연결 닫기") }
};
var OracleCommon = {
CreateConnection: function () { Alert("¢Oracle 연결 설정"),
OpenConnection: function () { Alert("Oracle 연결 열기") },
CreateCommand: function () { Alert("Create ¨Oracle 명령"),
ExcuteCommand: function () { 경고("DOracle 명령 실행") },
CloseConnection: function () { Alert("Close?Oracle 연결") }
};
(SQLServerCommon) {와 함께
eval("forSQLServer=" + DBCommon);
}
(OracleCommon) {
eval("forOracle=" + DBCommon);
}
forSQLServer();
오라클();
스크립트>
이것을 간단한 템플릿 메소드 패턴으로 생각하면 될까요? 헤헤. 함수의 컨텍스트를 변경하기 위해 eval 및 with를 사용하여 이를 호출할 수도 있습니다.
그러나 Eval은 일반적인 상황에서는 거의 사용되지 않으므로 사용을 완전히 피할 수 있습니다.