<b>function f(o) {</b>
<b>if (о === undefined) debugger; // Временная строка для отладки</b>
<b>// Далее продолжается тело функции.</b>
Теперь, когда f() будет вызвана без аргумента, ее выполнение будет приостановлено, и вы сможете воспользоваться отладчиком и просмотреть стек вызовов, чтобы отыскать место, откуда был выполнен некорректный вызов.
Официально инструкция
<b>debugger</b>
была добавлена в язык стандартом ЕСМА-Script 5, но производители основных броузеров реализовали ее уже достаточно давно. Обратите внимание, что недостаточно иметь отладчик: инструкция
<b>debugger</b>
не запускает отладчик автоматически. Однако, если отладчик уже запущен, эта инструкция будет действовать как точка останова. Если, к примеру, воспользоваться расширением Firebug для Firefox, это расширение должно быть активировано для веб-страницы, которую требуется отладить, и только в этом случае инструкция
<b>debugger</b>
будет работать.
5.7.3. "use strict"
"
<b>use strict</b>
” - это директива, введенная стандартом ECMAScript 5. Директивы не являются инструкциями (но достаточно близки, чтобы включить описание "
<b>use strict</b>
” в эту главу). Между обычными инструкциями и директивой "
<b>use strict</b>
" существует два важных отличия:
• Она не включает никаких зарезервированных слов языка: директива - это лишь выражение, содержащее специальный строковый литерал (в одиночных или двойных кавычках). Интерпретаторы JavaScript, не соответствующие стандарту ECMAScript 5, будут интерпретировать ее как простое выражение без побочных эффектов и ничего не будут делать. В будущих версиях стандарта ECMAScript, как ожидается, слово use будет переведено в разряд ключевых слов, что позволит опустить кавычки.
• Она может появляться только в начале сценария или в начале тела функции, перед любыми другими инструкциями. Однако она не обязательно должна находиться в самой первой строке сценария или функции: директиве
<b>"use strict"</b>
могут предшествовать или следовать за ней другие строковые выражения-литералы, а различные реализации JavaScript могут интерпретировать эти строковые литералы как директивы, определяемые этими реализациями. Строковые литералы, следующие за первой обычной инструкцией в сценарии или функции, интерпретируются как обычные выражения - они могут не восприниматься как директивы и не оказывать никакого эффекта.
Назначение директивы
<b>"use strict"</b>
состоит в том, чтобы показать, что следующий за ней программный код (в сценарии или функции) является строгим кодом. Строгим считается программный код верхнего уровня (не внутри функций), если в сценарии имеется директива
<b>"use strict".</b>
Строгим считается тело функции, если она определяется внутри строгого программного кода или если она содержит директиву
<b>"use strict</b>
". Строгим считается программный код, передаваемый методу
<b>eval(),</b>
если вызов
<b>eval()</b>
выполняется из строгого программного кода или если строка с кодом содержит директиву
<b>"use strict".</b>
Строгий программный код выполняется в строгом режиме. Согласно стандарту ECMAScript 5, строгий режим определяет ограниченное подмножество языка, благодаря чему исправляет некоторые недостатки языка, а также обеспечивает более строгую проверку на наличие ошибок и повышенный уровень безопасности. Ниже перечислены различия между строгим и нестрогим режимами (первые три имеют особенно большое значение):
• В строгом режиме не допускается использование инструкции
<b>with</b>
.
• В строгом режиме все переменные должны объявляться: если попытаться присвоить значение идентификатору, который не является объявленной переменной, функцией, параметром функции, параметром конструкции
<b>catch</b>
или свойством глобального объекта, возбуждается исключение
<b>ReferenceError</b>
. (В нестрогом режиме такая попытка просто создаст новую глобальную переменную и добавит ее в виде свойства в глобальный объект.)
• В строгом режиме функции, которые вызываются как функции (а не как методы), получают в ссылке
<b>this</b>
значение
<b>undefined</b>
. (В нестрогом режиме функции, которые вызываются как функции, всегда получают в ссылке
<b>this</b>
глобальный объект.) Это отличие можно использовать, чтобы определить, поддерживает ли та или иная реализация строгий режим:
<b>var hasStrictMode = (function() { "use strict"; return this===undefined}());</b>
Кроме того, когда функция вызывается в строгом режиме с помощью
<b>саll()</b>
или
<b>аррlу(),</b>
значение ссылки
<b>this</b>
в точности соответствует значению, переданному в первом аргументе функции
<b>саll()</b>
или
<b>аррlу()</b>
. (В нестрогом режиме значения
<b>null</b>
и
<b>undefined</b>
замещаются ссылкой на глобальный объект, а простые значения преобразуются в объекты.)
• В строгом режиме попытки присвоить значения свойствам, недоступным для записи, или создать новые свойства в нерасширяемых объектах порождают исключение
<b>TypeError</b>
. (В нестрогом режиме эти попытки просто игнорируются.)
• В строгом режиме программный код, передаваемый функции
<b>eval(),</b>
не может объявлять переменные или функции в области видимости вызывающего программного кода, как это возможно в нестрогом режиме. Вместо этого переменные и функции помещаются в новую область видимости, создаваемую для функции
<b>eval().</b>
Эта область видимости исчезает, как только
<b>eval()</b>
вернет управление.
• В строгом режиме объект
<b>arguments </b>
(раздел 8.3.2) в функции хранит статическую копию значений, переданных функции. В нестрогом режиме объект
<b>arguments</b>
ведет себя иначе - элементы массива
<b>arguments</b>
и именованные параметры функции ссылаются на одни и те же значения.
• В строгом режиме возбуждается исключение
<b>SyntaxError</b>
, если оператору
<b>delete</b>
передать неквалифицированный идентификатор, такой как имя переменной, функции или параметра функции. (В нестрогом режиме такое выражение
<b>delete</b>
не выполнит никаких действий и вернет
<b>false</b>
.)