Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «use strict». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`"use strict"`** - це директива, яка вмикає **строгий режим інтерпретації JavaScript**, допомагаючи писати безпечніший і передбачуваніший код, усуваючи "тихі" помилки і старе неочевидне поведінку. **Ключове:** у строгому режимі `this` у звичайних функціях стає `undefined` замість `window`, а необ'явлені змінні, дублювання параметрів та інші небезпечні дії кидають помилку.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Що таке `"use strict"` > `"use strict"` - це директива, яка вмикає **строгий режим інтерпретації JavaScript**. > > Він допомагає писати **безпечніший, передбачуваніший код**, усуваючи "тихі" помилки і старе неочевидне поведінку. Строгий режим діє **в межах файлу чи функції**, де його оголошено на початку: ```javascript "use strict"; ``` або: ```javascript function foo() { "use strict"; // строгий режим тільки всередині цієї функції } ``` --- ## 2. Головна зміна - поведінка `this` | Контекст | Без `"use strict"` | З `"use strict"` | |---|---|---| | У звичайній функції | `this` → `window` (у браузері) | `this` → `undefined` | | У методі об'єкта | `this` → сам об'єкт | `this` → той самий об'єкт (не змінюється) | | У стрілковій функції | успадковується ззовні | успадковується ззовні (не змінюється) | --- ### Приклад без строгого режиму ```javascript function showThis() { console.log(this); } showThis(); // window (у браузері) ``` Тут JS "підставляє" глобальний об'єкт (`window`) за замовчуванням. --- ### Приклад зі строгим режимом ```javascript "use strict"; function showThis() { console.log(this); } showThis(); // undefined ``` У строгому режимі, якщо функцію викликано **не як метод об'єкта**, `this` залишається `undefined` - жодних неявних "магічних" прив'язок. Це допомагає уникнути випадкових звернень до глобального об'єкта (наприклад, `window` або `global`). --- ## 3. Строгий режим забороняє неявне створення змінних Без строгого режиму: ```javascript function test() { x = 10; // змінна створиться глобально! console.log(x); } test(); console.log(window.x); // 10 ``` З `"use strict"`: ```javascript "use strict"; function test() { x = 10; // ReferenceError: x is not defined } test(); ``` Тепер потрібно **оголошувати змінні явно** (`let`, `const`, `var`), інакше - помилка. --- ## 4. Забороняє дублювання імен змінних і параметрів Без строгого режиму: ```javascript function sum(a, a, c) { return a + a + c; } console.log(sum(1, 2, 3)); // 7 ``` З `"use strict"`: ```javascript "use strict"; function sum(a, a, c) { // SyntaxError return a + a + c; } ``` Це запобігає помилкам і робить код передбачуванішим. --- ## 5. Забороняє видалення змінних, функцій і параметрів Без строгого режиму: ```javascript var a = 1; delete a; // false ``` З `"use strict"`: ```javascript "use strict"; var a = 1; delete a; // SyntaxError ``` У строгому режимі не можна видаляти те, що не є властивістю об'єкта. --- ## 6. Забороняє присвоєння значення `NaN`, `undefined`, `Infinity` ```javascript "use strict"; undefined = 5; // TypeError NaN = 123; // TypeError Infinity = 42; // TypeError ``` --- ## 7. Покращує безпеку `eval` Без строгого режиму `eval` може створювати змінні в поточному контексті: ```javascript eval("var x = 10;"); console.log(x); // 10 ``` Зі строгим режимом `eval` створює власну область видимості: ```javascript "use strict"; eval("var x = 10;"); console.log(x); // ReferenceError ``` Це запобігає випадковому забрудненню оточення. --- ## 8. Захищає від неявних "м'яких" помилок | Ситуація | Без `"use strict"` | З `"use strict"` | |---|---|---| | Присвоєння в `NaN`, `undefined`, `Infinity` | тихо ігнорується | помилка | | Присвоєння в `const` | ігнорується | помилка | | Заборона `with` | можна | не можна | | Видалення властивостей з об'єктів | тихо ігнорується | помилка | --- ## ПІДСУМОК | Що змінює `"use strict"` | Поведінка | |---|---| | `this` у звичайних функціях | `undefined` замість `window` | | Необ'явлені змінні | Помилка | | Дублюючі параметри | Помилка | | Видалення змінних/функцій | Помилка | | Присвоєння в `NaN`, `undefined`, `Infinity` | Помилка | | `eval` | Створює власний scope | | `with` | Заборонено |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.