Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

В спецификациях 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
.

  • Читать дальше
  • 1
  • ...
  • 497
  • 498
  • 499
  • 500
  • 501
  • 502
  • 503
  • 504
  • 505
  • 506
  • 507
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: