JavaScript. Подробное руководство, 6-е издание
<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>: программный код просто выполнялся ею в локальном контексте.) Но IE определяет глобальную функцию<b>EvalError</b>которая выполняет строку с программным кодом, переданную в виде аргумента, как если бы она была сценарием верхнего уровня. (Однако, в отличие от<b>execScript(),</b>функция<b>eval(),</b>всегда возвращает<b>execScript()</b>.)<b>null</b>4.12.3. Использование eval() в строгом режиме
Строгий режим (раздел 5.7.3), определяемый стандартом ECMAScript 5, вводит дополнительные ограничения на поведение функции
и даже на использование идентификатора «eval». Когда функция<b>eval()</b>вызывается из программного кода, выполняемого в строгом режиме, или когда строка, которая передается функции, начинается с директивы «use strict», то<b>eval()</b>выполняет программный код в частном окружении. Это означает, что в строгом режиме выполняемый программный код может обращаться к локальным переменным и изменять их, но он не может определять новые переменные или функции в локальной области видимости.<b>eval()</b>Кроме того, строгий режим делает функцию
еще более похожей на оператор, фактически превращая «eval» в зарезервированное слово. В этом режиме нельзя переопределить функцию<b>eval()</b>новым значением. А также нельзя объявить переменную, функцию, параметр функции или параметр блока<b>eval()</b>с именем «eval».<b>catch</b>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>для всех значений, возможных в языке JavaScript:<b>typeof</b>Оператор typeof может применяться, например, в таких выражениях:
<b>(typeof value == "string") ? ..... + value + ..... : value</b>Оператор
можно также использовать в инструкции switch (раздел 5.4.3). Обратите внимание, что операнд оператора<b>typeof </b>можно заключить в скобки, что делает оператор<b>typeof</b>более похожим на имя функции, а не на ключевое слово или оператор:<b>typeof</b><b>typeof(і)</b>Обратите внимание, что для значения null оператор
возвращает строку «object». Если вам потребуется отличать<b>typeof</b>от других объектов, добавьте проверку для этого спецслучая. Для объектов, определяемых средой выполнения, оператор<b>null</b>может возвращать строку, отличную от «object». Однако на практике большинство таких объектов в клиентском JavaScript имеют тип «object».<b>typeof</b>Для всех объектных типов и типов массивов результатом оператора
является строка «object», поэтому он может быть полезен только для определения принадлежности значения к объектному или к простому типу. Чтобы отличить один класс объектов от другого, следует использовать другие инструменты, такие как оператор<b>typeof </b>(раздел 4.9.4), атрибут<b>instanceof</b>(раздел 6.8.2) или свойство<b>class</b>(разделы 6.8.1 и 9.2.2).<b>constructor</b>
