Функция eval на самом деле очень проста: она заключается в передаче строки интерпретатору JS, а интерпретатор Javascript интерпретирует эту строку в код Javascript и выполняет ее.
Возьмем самый простой пример:
Скопируйте код кода следующим образом:
<тип сценария="текст/javascript">
eval("оповещение(1+1)");
сценарий>
Это очень просто: интерпретируйте строку в код JS и выполните ее, и появится надпись 2.
Конечно, приведенный выше пример — всего лишь игрушка, и никто не будет настолько глуп, чтобы использовать его на практике. Я думаю, что самый простой способ использования функции eval — это DOM. Например, если у нас есть div1, div2 и div3, то нет возможности получить наш идентификатор при использовании document.getElementByID. Поэтому самый простой способ — это использовать. используйте его в цикле for. Используйте eval для объединения такой программы. Например:
Скопируйте код кода следующим образом:
<тип сценария="текст/javascript">
for (var цикл = 1; цикл <10; цикл++) {
eval('document.getElementById("div"+loop).innerHTML="123"');
}
сценарий>
После разговора о самом простом использовании я считаю, что эта функция по-прежнему интересна всем. Если бы у этой функции было всего несколько применений, это было бы слишком скучно. Затем давайте рассмотрим функцию eval() по частям.
Давайте начнем с области действия eval и посмотрим на эту функцию:
Скопируйте код кода следующим образом:
<тип сценария="текст/javascript">
eval("вар i=3");
предупреждение (я);
сценарий>
Код очень простой, и результат может появиться 3. Далее сравните этот код:
Скопируйте код кода следующим образом:
<тип сценария="текст/javascript">
вар тест = функция () {
eval("вар i=3");
предупреждение (я);
}
тест();
предупреждение (я);
сценарий>
В результате сначала появляется 3, а затем неопределенное.
Итак, объясните: код, динамически выполняемый функцией eval(), не создает новую область видимости, и его код выполняется в текущей области видимости. Другими словами, функция eval() также может использовать этот, аргумент и другие объекты в текущей области видимости.
В IE поддерживается функция, очень похожая на eval(): execScript(). Мы можем написать простой код.
Скопируйте код кода следующим образом:
<тип сценария="текст/javascript">
вар тест = функция () {
execScript("var i=3");
предупреждение (я);
}
тест();
предупреждение (я);
сценарий>
В результате появились две тройки. Это также показывает характеристики функции execScript. Прежде всего, она похожа на eval. Она может интерпретировать строки в JS-код и выполнять его, но ее областью действия является не текущая область действия. глобальная сфера. Когда мы попробуем приведенный выше код в Firefox и Google Chrome: мы обнаружим, что код execScript недействителен в Firefox, что также указывает на проблему. Существует проблема с совместимостью кода execScript с браузером.
Тогда возникает вопрос, как можно совместить "преимущества" этих двух функций, то есть глобальную + браузерную совместимость. Я поискал в Интернете и сам обобщил это, вероятно, так:
Скопируйте код кода следующим образом:
<тип сценария="текст/javascript">
вар StrongEval = функция (код) {
if (window.navigator.userAgent.indexOf("MSIE") >= 1) {
execScript (код);
}
if (window.navigator.userAgent.indexOf("Firefox") >= 1) {
окно.eval(код);
}
еще {
execScript (код);
}
};
вар Тест = функция () {
StrongEval("var i=3");
}
Тест();
предупреждение (я);
сценарий>
Таким образом, он может быть полностью совместим с FF и IE. Суть кода заключается в том, что eval и window.eval не эквивалентны в FF. Это очень странная вещь.
Кроме того, мы можем использовать eval+with для достижения некоторых странных трюков.
В общем смысле мы можем написать такой код:
Скопируйте код кода следующим образом:
вар obj = функция () {
это.а = 1;
это.б = 2;
это.с = 5;
this.fun = функция () {
это.с = это.а + это.б;
}
};
вар о = новый объект ();
о.веселье();
оповещение (ок);
Или это:
Скопируйте код кода следующим образом:
вар объект = {
а: 1,
б: 2,
в: 5,
веселье: функция () {
это.с = это.а + это.б;
}
}
Или это:
Скопируйте код кода следующим образом:
вар obj = функция () {
это.а = 1;
это.б = 2;
это.с = 5;
};
obj.prototype.fun = функция () {
это.с = это.а + это.б;
}
вар о = новый объект ();
о.веселье();
оповещение (ок);
Несмотря ни на что, вы устали от этого чувства? Тогда давайте воспользуемся совершенно другим подходом, чтобы он был, по крайней мере, более комфортным для чувств.
Скопируйте код кода следующим образом:
<тип сценария="текст/javascript">
вар funtemp = функция () {
в = а + б;
}
вар объект = {
а: 1,
б: 2,
с: 5
};
вар весело;
с (объект) {
eval("fun = " + funtemp);
}
веселье();
предупреждение (obj.c);
сценарий>
Это очень вынужденно и очень хорошо. Мы не собираемся обсуждать, удобно это или нет. Давайте обсудим такую ситуацию.
Скопируйте код кода следующим образом:
<скрипт>
varDBCommon = функция () {
Оповещение("1."); СоздатьСоединение();
Оповещение("2."); ОткрытоеСоединение();
Оповещение("3."); СоздатьКоманду();
Оповещение("4."); ВыполнитьКоманду();
Оповещение("5."); ЗакрытьСоединение();
}
вар SQLServerCommon = {
CreateConnection: function () { alert("Установить соединение с SQL Server" },
OpenConnection: function () { alert("Открыть соединение с SQL Server" },
CreateCommand: function () { alert("Создать команду SQL Server" },
ExcuteCommand: function () { alert("Выполнить команду DSQL Server" },
CloseConnection: function () { alert("Закрыть соединение с SQL Server" };
};
вар OracleCommon = {
CreateConnection: function () { alert("Установить соединение с Oracle" },
OpenConnection: function () { alert("Открыть соединение с Oracle" },
CreateCommand: function () { alert("Создать команду Oracle" },
ExcuteCommand: function () { alert("Выполнить команду DOracle" },
CloseConnection: function () { alert("Закрыть соединение Oracle" };
};
с (SQLServerCommon) {
eval("forSQLServer=" + DBCommon);
}
с (OracleCommon) {
eval("forOracle=" + DBCommon);
}
дляSQLServer();
дляОракла();
сценарий>
Можем ли мы думать об этом как о простом шаблонном шаблоне метода? хе-хе. Мы также можем вызвать это, используя eval и with, чтобы изменить контекст функции.
Но опять же, Eval редко используется в общих ситуациях, и мы можем полностью отказаться от его использования.