Чтение онлайн

ЖАНРЫ

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

Строка, закодированная с помощью

escape,
декодируется функцией
unescape.

Хотя функция

escape
стандартизована в первой версии ECMAScript, она была признана устаревшей и удалена из стандарта в ECMAScript v3. Реализации ECMAScript обычно поддерживают эту функцию, хотя это необязательно. Вместо
escape
следует использовать функции
encodeURI
и
encodeURIComponent.

Пример

escape("Hello World!"); // Вернет "Hello%20World%21"

См.

также

encodeURI, encodeURIComponent

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

Поделиться с друзьями: