У своїй одержимості вибудовувати числові літерали розробник ненавмисно ініціалізував змінну b
з восьмеричним літералом . Нестрогий режим буде інтерпретувати це як числовий літерал зі значенням 24
(у базі 10). Однак суворий режим призведе до помилки.
Область застосування
Історично JavaScript заплутався у тому, як визначаються функції. Іноді вони, здається, мають статичний обсяг, але деякі функції змушують їх вести себе так, ніби вони динамічно оцінюються. Це заплутано, ускладнює програми для читання та розуміння. Нерозуміння викликає помилки. Це також є проблемою для продуктивності. Статичний діапазон дозволяє дозволити змінній прив'язки відбуватися під час компіляції, але вимога щодо динамічного масштабу означає, що прив'язка повинна бути відкладена на час виконання, що приводить до значного штрафу за продуктивність.
Суворий режим вимагає, щоб всі прив'язки змінної виконувалися статично. Це означає, що функції, які раніше вимагали динамічного зв’язування, повинні бути усунені або модифіковані. Зокрема, оператор with виключено, а здатність функції eval не змінювати навколишнє середовище свого абонента суворо обмежена.
Однією з переваг суворого коду є те, що такі інструменти, як YUI Compressor,
можуть зробити кращу роботу при його обробці.
Причетні глобальні змінні
JavaScript має на увазі глобальні змінні. Якщо ви явно не декларуєте змінну, глобальна змінна для вас неявно оголошена. Це полегшує програмування для початківців, оскільки вони можуть нехтувати деякими основними справами по господарству. Але це ускладнює управління більшими програмами і значно погіршує надійність. Тож у суворому режимі маються на увазі глобальні змінні більше не створюються. Вам слід чітко оголосити всі свої змінні.
Глобальний витік
Існує ряд ситуацій, які можуть спричинити this
прив'язку до глобального об'єкта. Наприклад, якщо ви забудете надати new
префікс під час виклику функції конструктора, конструктор this
несподівано буде прив’язаний до глобального об'єкта, тому замість ініціалізації нового об'єкта він замість того, щоб мовчки підробити глобальні змінні. У таких ситуаціях, строгий режим замість того, щоб зв'язуватися this
з undefined
, що викличе конструктор кинути виняток замість цього, дозволяючи помилка буде виявлена набагато раніше.
Шумний збій
JavaScript завжди мав властивості лише для читання, але ви не могли створити їх самостійно, поки Object.createProperty
функція ES5 не відкрила цю можливість. Якщо ви спробували призначити значення властивості лише для читання, воно буде мовчати. Призначення не змінить значення властивості, але ваша програма діятиме так, як ніби вона була. Це небезпека цілісності, яка може призвести до переходу програм у невідповідний стан. У суворому режимі спроба змінити властивість лише для читання призведе до виключення.
Октальна
Октальне (або базове 8) подання чисел було надзвичайно корисним при програмуванні на машинному рівні на машинах, розміри яких були кратними 3. Вам потрібен восьмеричний при роботі з мейнфреймом CDC 6600, який має розмір слова 60 біт. Якби ви могли прочитати восьмерику, ви могли поглянути на слово як 20 цифр. Дві цифри представляли оп-код, а одна цифра ототожнювала один з 8 регістрів. Під час повільного переходу від машинних кодів до мов високого рівня вважалося корисним надати вісімкові форми в мовах програмування.
У С було обрано надзвичайно прикро представлення восьмеричності: Провідний нуль. Так що в C 0100
означає 64, а не 100, і 08
це помилка, а не 8. Ще більше, на жаль, цей анахронізм був скопійований майже у всі сучасні мови, включаючи JavaScript, де він використовується лише для створення помилок. Це не має іншого призначення. Тож у суворому режимі восьмеричні форми більше не допускаються.
Et cetera
Аргумент псевдомасив стає трохи більш схожим на масив в ES5. У строгому режимі, вона втрачає своє callee
і caller
властивість. Це дає можливість передавати ваш arguments
ненадійний код, не віддаючи багато конфіденційного контексту. Також
arguments
усувається властивість функцій.
У суворому режимі дублюючі клавіші у функціональному букварі створюють синтаксичну помилку. Функція не може мати два параметри з однаковою назвою. Функція не може мати змінну з тим самим ім'ям, як один із її параметрів. Функція не може мати delete
власні змінні. Спроба
delete
неконфігуруваного властивості наражає виняток. Примітивні значення не зафіксовано неявно.
ECMAScript 5 додає список зарезервованих слів. Якщо ви використовуєте їх як змінні чи аргументи, суворий режим призведе до помилки. Зарезервовані слова: