<b>escape()</b>
- глобальная функция, которая возвращает новую строку, содержащую закодированную версию аргумента s. Сама строка s не изменяется. Функция
<b>escape()</b>
возвращает строку, в которой все символы, имеющиеся в строке s, отличные от букв, цифр и символов пунктуации (@, *, _, +, -,. и /) набора ASCII, заменены управляющими последовательностями в формате %хх или %ихххх (где х обозначает шестнадцатеричную цифру). Символы Юникода от \u0000 до \u00f f заменяются управляющей последовательностью %хх, все остальные символы Юникода - последовательностью %uхххх.
Строка, закодированная с помощью
<b>escape(),</b>
декодируется функцией
<b>unescape().</b>
Хотя функция
<b>escape()</b>
стандартизована в первой версии ECMAScript, она была признана устаревшей и удалена из стандарта в ECMAScript v3. Реализации ECMAScript обычно поддерживают эту функцию, хотя это необязательно. Вместо
<b>escape()</b>
следует использовать функции
<b>encodeURI()</b>
и
<b>encodeURIComponent().</b>
Пример
<b>escape("Hello World!"); // Вернет "Hello%20World%21"</b>
См. также
encodeURI(), encodeURIComponent()
Eval
eval()
исполняет содержащийся в строке JavaScript-код
Синтаксис
<b>eval(код)</b>
Аргументы
код Строка, содержащая выполняемое выражение или инструкции.
Возвращаемое значение
Значение, полученное в результате выполнения кода, если оно есть.
Исключения
Функция
<b>eval()</b>
возбуждает исключение
<b>SyntaxError</b>
, если аргумент код содержит некорректный программный код на языке JavaScript. Если исключение будет возбуждено самим программным кодом в аргументе код, функция
<b>eval()</b>
передаст его выше по стеку вызовов.
Описание
<b>eval()</b>
- это метод глобального объекта, вычисляющий строку, в которой содержится программный код на языке JavaScript. Если код содержит JavaScript-выражение,
<b>eval()</b>
вычислит выражение и вернет его значение. Если код содержит одну или несколько JavaScript-инструкций,
<b>eval()</b>
выполнит эти инструкции и вернет то значение (если оно есть), которое вернет последняя инструкция. Если код не возвращает никакого значения,
<b>eval()</b>
вернет значение undefined. И наконец, если код сгенерирует исключение,
<b>eval()</b>
передаст это исключение вызывающей программе.
В спецификациях ECMAScript 3 и ECMAScript 5 определяется различное поведение функции
<b>eval().</b>
Кроме того, в спецификации ECMAScript 5 для нее определяется различное поведение в строгом и нестрогом режимах. Чтобы объяснить эти различия, необходимо немного отклониться от темы. Реализовать эффективный интерпретатор намного проще, когда язык программирования определяет
<b>eval</b>
как оператор, а не как функцию. В языке JavaScript eval является функцией, но ради обеспечения эффективности в нем различаются непосредственные и косвенные вызовы
<b>eval().</b>
В непосредственном вызове используется идентификатор
<b>eval</b>
, и, если убрать скобки, вызов функции будет выглядеть как применение оператора
<b>eval</b>
. Любые другие вызовы
<b>eval()</b>
являются косвенными. Если присвоить функцию
<b>eval()</b>
переменной с другим именем и вызвать по имени переменной, это будет косвенный вызов. Аналогично, если вызвать
<b>eval()</b>
как метод глобального объекта, это также будет косвенный вызов. Определив понятия непосредственного и косвенного вызова, поведение функции
<b>eval()</b>
можно описать следующим образом:
Непосредственный вызов, ES3 и нестрогий режим ES5
<b>eval()</b>
выполняет код в текущей лексической области видимости. Если код объявляет переменную или функцию, она будет определена в локальной области видимости. Это обычный случай использования функции
<b>eval().</b>
Косвенный вызов, ES3
Спецификация ECMAScript 3 позволяет интерпретаторам возбуждать исключение
<b>EvalError</b>
для любых косвенных вызовов
<b>eval().</b>
На практике реализации ES3 обычно этого не делают, тем не менее в них следует избегать косвенных вызовов.
Косвенный вызов, ES5
Согласно спецификации ECMAScript 5, вместо того чтобы возбудить исключение
<b>EvalError</b>
, косвенный вызов
<b>eval()</b>
должен выполнить код в глобальной области видимости, игнорируя любые локальные переменные в текущей лексической области видимости. В ES5 можно выполнить присваивание
<b>var geval = eval;</b>
и затем использовать
<b>geval()</b>
для выполнения кода в глобальной области видимости.
Непосредственный и косвенный вызов, строгий режим
В строгом режиме объявления переменных и функций в коде определяют их в частной области видимости, которая действует только в данном вызове функции
<b>eval().</b>
Это означает, что в строгом режиме непосредственный вызов
<b>eval()</b>
не может изменить лексическую область видимости, а косвенный вызов не может изменить глобальную область видимости. Эти правила действуют, если вызов
<b>eval()</b>
выполняется в строгом режиме или если код начинается с директивы «use strict».
Функция
<b>eval()</b>
в языке JavaScript предоставляет очень мощные возможности, тем не менее она не часто используется в реальных программах. Очевидной областью ее применения являются программы, работающие как рекурсивные интерпретаторы JavaScript или динамически генерирующие и выполняющие JavaScript-код. Большинство JavaScript-функций, принимающих строковые аргументы, могут также принимать аргументы других типов и перед обработкой просто преобразуют эти значения в строки. Метод
<b>eval()</b>
ведет себя иначе. Если аргумент код не является элементарным строковым значением, он возвращается в неизменном виде. Поэтому будьте внимательны, чтобы случайно не передать функции
<b>eval()</b>
объект
<b>String</b>
вместо элементарного строкового значения.