<b>} </b>
<b>console.log(f(), х); //Изменилась локальная переменная: выведет "localchanged global": </b>
<b>console.log(g(), у); //Изменилась глобальная переменная: выведет "local globalchanged":</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>х > 0 ? х : -х // Абсолютное значение х</b>
Операнды условного оператора могут быть любого типа. Первый операнд вычисляется и используется как логическое значение. Если первый операнд имеет истинное значение, то вычисляется и возвращается значение выражения во втором операнде. Если первый операнд имеет ложное значение, то вычисляется и возвращается значение выражения в третьем операнде. Вычисляется всегда только какой-то один операнд, второй или третий, и никогда оба.
Тот же результат можно получить с помощью инструкции
<b>if</b>
, но оператор
<b>?:</b>
часто оказывается удобным сокращением. Ниже приводится типичный пример, в котором проверяется, определена ли переменная (и имеет истинное значение), и если да, то берется ее значение, а если нет, берется значение по умолчанию:
<b>greeting = "hello " + (username ? username : "there");</b>
Эта проверка эквивалентна следующей конструкции if, но более компактна:
<b>greeting = "hello";</b>
<b>if (username)</b>
<b> greeting += username;</b>
<b>else</b>
<b> greeting += "there";</b>
4.13.2. Оператор typeof
Унарный оператор
<b>typeof</b>
помещается перед единственным операндом, который может иметь любой тип. Его значением является строка, указывающая на тип данных операнда. Следующая таблица определяет значения оператора
<b>typeof</b>
для всех значений, возможных в языке JavaScript:
Оператор typeof может применяться, например, в таких выражениях:
<b>(typeof value == "string") ? ..... + 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).