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

<b>} </b>

<b>console.log(f(), х); //Изменилась локальная переменная: выведет &quot;localchanged global&quot;: </b>

<b>console.log(g(), у); //Изменилась глобальная переменная: выведет &quot;local globalchanged&quot;:</b>

Обратите внимание, что обеспечение возможности вызывать функцию

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

До появления версии IE9 Internet Explorer отличался от других броузеров: функция

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

4.12.3. Использование eval() в строгом режиме

Строгий режим (раздел 5.7.3), определяемый стандартом ECMAScript 5, вводит дополнительные ограничения на поведение функции

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

Кроме того, строгий режим делает функцию

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

4.13. Прочие операторы

JavaScript поддерживает еще несколько операторов, которые описываются в следующих разделах.

4.13.1. Условный оператор (?:)

Условный оператор - это единственный тернарный (с тремя операндами) оператор в JavaScript, и иногда он так и называется - «тернарный оператор». Этот оператор обычно записывается как

<b>?:</b>
, хотя в программах он выглядит по-другому. Он имеет три операнда, первый предшествует символу ?, второй - между ? и :, третий - после :. Используется он следующим образом:

<b>х &gt; 0 ? х : -х // Абсолютное значение х</b>

Операнды условного оператора могут быть любого типа. Первый операнд вычисляется и используется как логическое значение. Если первый операнд имеет истинное значение, то вычисляется и возвращается значение выражения во втором операнде. Если первый операнд имеет ложное значение, то вычисляется и возвращается значение выражения в третьем операнде. Вычисляется всегда только какой-то один операнд, второй или третий, и никогда оба.

Тот же результат можно получить с помощью инструкции

<b>if</b>
, но оператор
<b>?:</b>
часто оказывается удобным сокращением. Ниже приводится типичный пример, в котором проверяется, определена ли переменная (и имеет истинное значение), и если да, то берется ее значение, а если нет, берется значение по умолчанию:

<b>greeting = &quot;hello &quot; + (username ? username : &quot;there&quot;);</b>

Эта проверка эквивалентна следующей конструкции if, но более компактна:

<b>greeting = &quot;hello&quot;;</b>

<b>if (username)</b>

<b>  greeting += username;</b>

<b>else</b>

<b>  greeting += &quot;there&quot;;</b>

4.13.2. Оператор typeof

Унарный оператор

<b>typeof</b>
помещается перед единственным операндом, который может иметь любой тип. Его значением является строка, указывающая на тип данных операнда. Следующая таблица определяет значения оператора
<b>typeof</b>
для всех значений, возможных в языке JavaScript:

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

Оператор typeof может применяться, например, в таких выражениях:

<b>(typeof value == &quot;string&quot;) ? ..... + value + ..... : value</b>

Оператор

<b>typeof </b>
можно также использовать в инструкции switch (раздел 5.4.3). Обратите внимание, что операнд оператора
<b>typeof</b>
можно заключить в скобки, что делает оператор
<b>typeof</b>
более похожим на имя функции, а не на ключевое слово или оператор:

<b>typeof(і)</b>

Обратите внимание, что для значения null оператор

<b>typeof</b>
возвращает строку «object». Если вам потребуется отличать
<b>null</b>
от других объектов, добавьте проверку для этого спецслучая. Для объектов, определяемых средой выполнения, оператор
<b>typeof</b>
может возвращать строку, отличную от «object». Однако на практике большинство таких объектов в клиентском JavaScript имеют тип «object».

Для всех объектных типов и типов массивов результатом оператора

<b>typeof </b>
является строка «object», поэтому он может быть полезен только для определения принадлежности значения к объектному или к простому типу. Чтобы отличить один класс объектов от другого, следует использовать другие инструменты, такие как оператор
<b>instanceof</b>
(раздел 4.9.4), атрибут
<b>class</b>
(раздел 6.8.2) или свойство
<b>constructor</b>
(разделы 6.8.1 и 9.2.2).