Mir-knigi.online
Книги онлайн читать бесплатно!
  • Главная
  • Жанры
  • ТОП книг
  • ТОП авторов
  • Контакты

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

Часть 43 из 535 Информация о книге

<b>var f = eval;</b>

<b>var g = f;</b>

Если допустить такую возможность, интерпретатор не сможет обеспечить безопасность оптимизации любых функций, вызывающих

<b>g()</b>
. Данной проблемы можно было бы избежать, если бы
<b>eval</b>
была оператором (и зарезервированным словом). С ограничениями, накладываемыми на функцию
<b>eval()</b>
, которые делают ее более похожей на оператор, мы познакомимся в разделах ниже (разделы 4.12.2 и 4.12.3).

************************************************************************

4.12.1. eval()

Функция

<b>eval()</b>
принимает единственный аргумент. Если передать ей значение, отличное от строки, она просто вернет это значение. Если передать ей строку, она попытается выполнить синтаксический анализ этой строки как программного кода на языке JavaScript и возбудит исключение SyntaxError в случае неудачи. В случае успеха она выполнит этот программный код и вернет значение последнего выражения или инструкции в строке либо значение
<b>undefined</b>
, если последнее выражение или инструкция не имеют значения. Если программный код в строке возбудит исключение, функция
<b>eval()</b>
передаст это исключение дальше.

Ключевой особенностью функции

<b>eval()</b>
(когда она вызывается таким способом) является то обстоятельство, что она использует окружение программного кода, вызвавшего ее. То есть она будет отыскивать значения переменных и определять новые переменные и функции, как это делает локальный программный код. Если функция определит локальную переменную х и затем вызовет
<b>eval(&quot;x”),</b>
она получит значение локальной переменной. Вызов
<b>eval( &quot;x=1&quot;)</b>
изменит значение локальной переменной. А если выполнить вызов
<b>eval(&quot;vaг у = 3; ”),</b>
будет объявлена новая локальная переменная
<b>у</b>
. Точно так же можно определять новые локальные функции:

<b>eval(&quot;function f() { return x+1; }&quot;);</b>

Если вызвать функцию

<b>eval()</b>
из программного кода верхнего уровня, она, разумеется, будет оперировать глобальными переменными и глобальными функциями.

Обратите внимание, что программный код в строке, передаваемой функции

<b>eval(),</b>
должен быть синтаксически осмысленным - эту функцию нельзя использовать, чтобы вставить фрагмент программного кода в вызывающую функцию. Например, бессмысленно писать вызов
<b>eval(&quot;return;&quot;),</b>
потому что инструкция
<b>return</b>
допустима только внутри функций, а тот факт, что программный код в строке использует то же самое окружение, что и вызывающая функция, не делает его частью этой функции. Если программный код в строке может расцениваться как самостоятельный сценарий (пусть и очень короткий, такой как
<b>х=0</b>
), его уже можно будет передавать функции
<b>eval().</b>
В противном случае
<b>eval()</b>
возбудит исключение
<b>SyntaxError</b>
.

4.12.2. Использование eval() в глобальном контексте

Способность функции

<b>eval()</b>
изменять локальные переменные представляет значительную проблему для оптимизаторов JavaScript. Для ее решения некоторые интерпретаторы просто уменьшают степень оптимизации всех функций, вызывающих
<b>eval().</b>
Однако как быть интерпретатору JavaScript, когда в сценарии определяется псевдоним функции
<b>eval()</b>
и выполняется ее вызов по другому имени? Чтобы облегчить жизнь разработчикам интерпретаторов JavaScript, стандарт ECMAScript 3 требует, чтобы такая возможность в интерпретаторах была запрещена. Если функция
<b>eval()</b>
вызывается под любым другим именем, отличным от «eval», она должна возбуждать исключение
<b>EvalError</b>
.

Однако большинство разработчиков используют иные решения. При вызове под любым другим именем функция

<b>eval()</b>
должна выполнять программный код в глобальном контексте. Выполняемый ею программный код может определять новые глобальные переменные или глобальные функции и изменять значения глобальных переменных, но не может использоваться для модификации локальных переменных в вызывающих функциях, благодаря чему устраняются препятствия для локальной оптимизации.

Стандарт ECMAScript 5 отменяет возбуждение исключения

<b>EvalError</b>
и стандартизует поведение
<b>eval(),</b>
сложившееся де-факто. «Прямой вызов» - это вызов функции
<b>eval()</b>
по ее непосредственному имени «eval» (которое все больше начинает походить на зарезервированное слово). Прямые вызовы
<b>eval()</b>
используют окружение вызывающего контекста. Любые другие вызовы - косвенные вызовы - в качестве окружения используют глобальный объект и не могут получать, изменять или определять локальные переменные или функции. Это поведение демонстрируется в следующем фрагменте:

<b>var geval = eval;         // Другое имя eval для вызова в глобальном контексте </b>

<b>var х = &quot;global&quot;, у = &quot;global&quot;; // Две глобальные переменные </b>

<b>function f() { // Вызывает eval в локальном контексте </b>

<b>  var х = &quot;local&quot;; // Определение локальной переменной </b>

<b>  eval(&quot;x += 'changed';&quot;); // Прямой вызов eval изменит локальную переменную </b>

<b>  return х; // Вернет измененную локальную переменную </b>

<b>} </b>

<b>function g() {     // Вызывает eval в глобальном контексте </b>

<b>  var у = &quot;local&quot;; // Локальная переменная </b>

<b>  geval(&quot;y += 'changed';&quot;) // Косвенный вызов eval изменит глоб. переменную </b>

<b>  return y;        // Вернет неизмененную локальную переменную </b>


Перейти к странице:
Предыдущая страница
Следующая страница
Жанры
  • Военное дело
  • Деловая литература
  • Детективы и триллеры
  • Детские
  • Детские книги
  • Документальная литература
  • Дом и дача
  • Дом и Семья
  • Жанр не определен
  • Зарубежная литература
  • Знания и навыки
  • История
  • Компьютеры и Интернет
  • Легкое чтение
  • Любовные романы
  • Научно-образовательная
  • Образование
  • Поэзия и драматургия
  • Приключения
  • Проза
  • Прочее
  • Психология и мотивация
  • Публицистика и периодические издания
  • Религия и духовность
  • Родителям
  • Серьезное чтение
  • Спорт, здоровье и красота
  • Справочная литература
  • Старинная литература
  • Техника
  • Фантастика и фентези
  • Фольклор
  • Хобби и досуг
  • Юмор
Mir-knigi.online

Бесплатная онлайн библиотека для чтения книг без регистрации с телефона или компьютера. У нас собраны последние новинки, мировые бестселлеры книжного мира.

Контакты
  • [email protected]
Информация
  • Карта сайта
© mir-knigi.online, 2026. | Вход