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

<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>&quot;use strict&quot;</b>
могут предшествовать или следовать за ней другие строковые выражения-литералы, а различные реализации JavaScript могут интерпретировать эти строковые литералы как директивы, определяемые этими реализациями. Строковые литералы, следующие за первой обычной инструкцией в сценарии или функции, интерпретируются как обычные выражения - они могут не восприниматься как директивы и не оказывать никакого эффекта.

Назначение директивы

<b>&quot;use strict&quot;</b>
состоит в том, чтобы показать, что следующий за ней программный код (в сценарии или функции) является строгим кодом. Строгим считается программный код верхнего уровня (не внутри функций), если в сценарии имеется директива
<b>&quot;use strict&quot;.</b>
Строгим считается тело функции, если она определяется внутри строгого программного кода или если она содержит директиву
<b>&quot;use strict</b>
". Строгим считается программный код, передаваемый методу
<b>eval(),</b>
если вызов
<b>eval()</b>
выполняется из строгого программного кода или если строка с кодом содержит директиву
<b>&quot;use strict&quot;.</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() { &quot;use strict&quot;; 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>
.)