Книга: JavaScript. Подробное руководство, 6-е издание

Eval

Eval

eval()

исполняет содержащийся в строке JavaScript-код

Синтаксис

eval(код)

Аргументы

код Строка, содержащая выполняемое выражение или инструкции.

Возвращаемое значение

Значение, полученное в результате выполнения кода, если оно есть.

Исключения

Функция eval() возбуждает исключение SyntaxError, если аргумент код содержит некорректный программный код на языке JavaScript. Если исключение будет возбуждено самим программным кодом в аргументе код, функция eval() передаст его выше по стеку вызовов.

Описание

eval() - это метод глобального объекта, вычисляющий строку, в которой содержится программный код на языке JavaScript. Если код содержит JavaScript-выражение, eval() вычислит выражение и вернет его значение. Если код содержит одну или несколько JavaScript-инструкций, eval() выполнит эти инструкции и вернет то значение (если оно есть), которое вернет последняя инструкция. Если код не возвращает никакого значения, eval() вернет значение undefined. И наконец, если код сгенерирует исключение, eval() передаст это исключение вызывающей программе.

В спецификациях ECMAScript 3 и ECMAScript 5 определяется различное поведение функции eval(). Кроме того, в спецификации ECMAScript 5 для нее определяется различное поведение в строгом и нестрогом режимах. Чтобы объяснить эти различия, необходимо немного отклониться от темы. Реализовать эффективный интерпретатор намного проще, когда язык программирования определяет eval как оператор, а не как функцию. В языке JavaScript eval является функцией, но ради обеспечения эффективности в нем различаются непосредственные и косвенные вызовы eval(). В непосредственном вызове используется идентификатор eval, и, если убрать скобки, вызов функции будет выглядеть как применение оператора eval. Любые другие вызовы eval() являются косвенными. Если присвоить функцию eval() переменной с другим именем и вызвать по имени переменной, это будет косвенный вызов. Аналогично, если вызвать eval() как метод глобального объекта, это также будет косвенный вызов. Определив понятия непосредственного и косвенного вызова, поведение функции eval() можно описать следующим образом:

Непосредственный вызов, ES3 и нестрогий режим ES5

eval() выполняет код в текущей лексической области видимости. Если код объявляет переменную или функцию, она будет определена в локальной области видимости. Это обычный случай использования функции eval().

Косвенный вызов, ES3

Спецификация ECMAScript 3 позволяет интерпретаторам возбуждать исключение EvalError для любых косвенных вызовов eval(). На практике реализации ES3 обычно этого не делают, тем не менее в них следует избегать косвенных вызовов.

Косвенный вызов, ES5

Согласно спецификации ECMAScript 5, вместо того чтобы возбудить исключение EvalError, косвенный вызов eval() должен выполнить код в глобальной области видимости, игнорируя любые локальные переменные в текущей лексической области видимости. В ES5 можно выполнить присваивание var geval = eval; и затем использовать geval() для выполнения кода в глобальной области видимости.

Непосредственный и косвенный вызов, строгий режим

В строгом режиме объявления переменных и функций в коде определяют их в частной области видимости, которая действует только в данном вызове функции eval(). Это означает, что в строгом режиме непосредственный вызов eval() не может изменить лексическую область видимости, а косвенный вызов не может изменить глобальную область видимости. Эти правила действуют, если вызов eval() выполняется в строгом режиме или если код начинается с директивы «use strict».

Функция eval() в языке JavaScript предоставляет очень мощные возможности, тем не менее она не часто используется в реальных программах. Очевидной областью ее применения являются программы, работающие как рекурсивные интерпретаторы JavaScript или динамически генерирующие и выполняющие JavaScript-код. Большинство JavaScript-функций, принимающих строковые аргументы, могут также принимать аргументы других типов и перед обработкой просто преобразуют эти значения в строки. Метод eval() ведет себя иначе. Если аргумент код не является элементарным строковым значением, он возвращается в неизменном виде. Поэтому будьте внимательны, чтобы случайно не передать функции eval() объект String вместо элементарного строкового значения.

Пример

eval("1+2"); // Вернет 3
// Этот фрагмент использует клиентские JavaScript-методы для запроса выражения 
// от пользователя и вывода результатов его вычисления.
// Подробности см. в описаниях клиентских методов Window.alert() и Window.рrompt().
try {
  alert("Результат: " + eval(prompt("Введите выражение:","")));
}
  catch(exception) { alert(exception);
}

EvalError

генерируется при некорректном использовании eval() Objects Errors EvalError

Конструктор

new EvalError()
new EvalErroг(сообщение)

Аргументы

сообщение Необязательное сообщение об ошибке с дополнительной информацией об исключении. Если этот аргумент указан, он принимается в качестве значения свойства message объекта EvalError.

Возвращаемое значение

Вновь созданный объект EvalError. Если задан аргумент сообщение, объект Error возьмет его в качестве значения своего свойства message; в противном случае в качестве значения этого свойства будет использована строка по умолчанию, определенная реализацией. Когда конструктор EvalError() вызывается как функция (без оператора new), он ведет себя точно так же, как при вызове с оператором new.

Свойства

message Сообщение об ошибке с дополнительной информацией об исключении.

В этом свойстве хранится строка, переданная конструктору, или строка по умолчанию, определенная реализацией. Подробности см. в статье с описанием свойства Error.message.

name Строка, определяющая тип исключения. Для всех объектов EvalError

значение этого свойства равно «EvalError».

Описание

Экземпляры класса EvalError могут создаваться, когда глобальная функция eval() вызывается с любым другим именем. Ограничения на способы вызова функции eval() рассматриваются в ее описании. Информация о генерации и перехвате исключений приводится в статье, посвященной классу Error.

См. также

Error, Error.message, Error.name

Оглавление книги


Генерация: 0.228. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз