JavaScript. Подробное руководство, 6-е издание
<b>function f(o) {</b><b>if (о === undefined) debugger; // Временная строка для отладки</b><b>// Далее продолжается тело функции.</b>Теперь, когда f() будет вызвана без аргумента, ее выполнение будет приостановлено, и вы сможете воспользоваться отладчиком и просмотреть стек вызовов, чтобы отыскать место, откуда был выполнен некорректный вызов.
Официально инструкция
была добавлена в язык стандартом ЕСМА-Script 5, но производители основных броузеров реализовали ее уже достаточно давно. Обратите внимание, что недостаточно иметь отладчик: инструкция<b>debugger</b>не запускает отладчик автоматически. Однако, если отладчик уже запущен, эта инструкция будет действовать как точка останова. Если, к примеру, воспользоваться расширением Firebug для Firefox, это расширение должно быть активировано для веб-страницы, которую требуется отладить, и только в этом случае инструкция<b>debugger</b>будет работать.<b>debugger</b>5.7.3. "use strict"
"
” - это директива, введенная стандартом ECMAScript 5. Директивы не являются инструкциями (но достаточно близки, чтобы включить описание "<b>use strict</b>” в эту главу). Между обычными инструкциями и директивой "<b>use strict</b>" существует два важных отличия:<b>use strict</b>• Она не включает никаких зарезервированных слов языка: директива - это лишь выражение, содержащее специальный строковый литерал (в одиночных или двойных кавычках). Интерпретаторы JavaScript, не соответствующие стандарту ECMAScript 5, будут интерпретировать ее как простое выражение без побочных эффектов и ничего не будут делать. В будущих версиях стандарта ECMAScript, как ожидается, слово use будет переведено в разряд ключевых слов, что позволит опустить кавычки.
• Она может появляться только в начале сценария или в начале тела функции, перед любыми другими инструкциями. Однако она не обязательно должна находиться в самой первой строке сценария или функции: директиве
могут предшествовать или следовать за ней другие строковые выражения-литералы, а различные реализации JavaScript могут интерпретировать эти строковые литералы как директивы, определяемые этими реализациями. Строковые литералы, следующие за первой обычной инструкцией в сценарии или функции, интерпретируются как обычные выражения - они могут не восприниматься как директивы и не оказывать никакого эффекта.<b>"use strict"</b>Назначение директивы
состоит в том, чтобы показать, что следующий за ней программный код (в сценарии или функции) является строгим кодом. Строгим считается программный код верхнего уровня (не внутри функций), если в сценарии имеется директива<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>• В строгом режиме объект
(раздел 8.3.2) в функции хранит статическую копию значений, переданных функции. В нестрогом режиме объект<b>arguments </b>ведет себя иначе - элементы массива<b>arguments</b>и именованные параметры функции ссылаются на одни и те же значения.<b>arguments</b>• В строгом режиме возбуждается исключение
, если оператору<b>SyntaxError</b>передать неквалифицированный идентификатор, такой как имя переменной, функции или параметра функции. (В нестрогом режиме такое выражение<b>delete</b>не выполнит никаких действий и вернет<b>delete</b>.)<b>false</b>