Питання Що таке "використовуйте строго" в JavaScript, і що це за аргументи?


Нещодавно я запустив деякий з моїх кодів JavaScript за допомогою Crockford's JSLint, і це дало наступну помилку:

Проблема в рядку 1 символ 1: Відсутня твердження "use strict".

Роблячи деякі пошуки, я зрозумів, що деякі люди додають "use strict"; в коді JavaScript. Після того як я додаю виписку, помилка припинила з'являтися. На жаль, Google не розкриває більшу частину історії, що стоїть за цим твердженим твердженням. Звичайно, це повинно мати якесь відношення до того, як інтерфейс JavaScript інтерпретується браузером, але я не знаю, який ефект буде.

Так що? "use strict"; все про те, що це означає, і чи це все ще актуальне?

Будь-який із поточних браузерів відповідає на "use strict"; струна або це для майбутнього використання?


6712
2017-08-26 16:10


походження




Відповіді:


Ця стаття про Javascript Strict Mode може вас зацікавити: Джон Ресіг - ECMAScript 5 строгий режим, JSON і багато іншого

Навести деякі цікаві частини:

Строгий режим - це нова функція в ECMAScript 5, яка дозволяє розмістити програму або функцію в "строгому" операційному контексті. Цей суворий контекст перешкоджає здійсненню певних дій і видає більшу кількість винятків.

І:

Чіткий режим допомагає виконати кілька способів:

  • Це ловить деякі загальні кодування, викидаючи винятки.
  • Це запобігає або викидає помилки, коли вживаються відносно "небезпечні" дії (наприклад, отримання доступу до глобального об'єкта).
  • Вона відключає функції, які незрозумілі або погано продумані.

Також зауважте, що ви можете застосувати "суворий режим" до всього файлу ... Або ви можете використовувати його лише для певної функції (все ще цитуючи статтю Джона Резіга):

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

Що може бути корисним, якщо вам потрібно змішувати старий та новий код ;-)

Отже, я думаю, це трохи схоже на "use strict" ви можете використовувати в Perl (звідси і назва?): це допомагає зменшити кількість помилок, виявляючи більше речей, які можуть призвести до поломки.

В даний час це є підтримується всіма основними браузерами  (панель IE 9 та нижче).


4399
2017-08-26 16:15



Зміна за замовчуванням через стільки років? Занадто пізно для цього: він би розбив стільки існуючих сайтів / скриптів / додатків ... Єдина можлива річ, щоб допомогти зробити ситуацію краще, для майбутнього. - Pascal MARTIN
Я спробував зробити невеликий фрагмент коду, який буде неправильним під час використання "use strict"в Firefox 3.6, Safari 5, Chrome 7 і Opera 10.6 (для всіх Mac). Ніяких помилок взагалі, тому я думаю, що "use strict" не підтримується в жодному браузері. Не протестував в IE9, хоча;) - Husky
Швидке оновлення: Firefox 4 має повну підтримку суворого режиму, і, наскільки я можу сказати, жоден інший веб-переглядач не працює. Safari та Chrome мають "часткову" підтримку, але я не знаю, що це означає. - Sasha Chedygov
Схоже, Chrome 11 проходить всі ці тести, як і IE10 ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html# - gman
@Julius - Це не могло бути реалізоване за допомогою зарезервованого ключового слова, тому код, який намагається викликати суворий режим, би переріс у старих браузерах. Додавання літерального рядка "довільного" не руйнує нічого. - nnnnnn


Це нова функція ECMAScript 5. Джон Ресіг написав гарне резюме з цього.

Це просто рядок, який ви помістили у ваші файли JavaScript (у верхній частині файлу або всередині функції), що виглядає так:

"use strict";

Введення його у ваш код тепер не повинно викликати проблем з поточними браузерами, оскільки це просто рядок. Це може спричинити проблеми з вашим кодом у майбутньому, якщо ваш код порушує прагму. Наприклад, якщо у вас є foo = "bar" без визначення foo по-перше, ваш код почне невдачу ... що, на мій погляд, є хорошим.


1103
2017-08-26 16:14



Невдало швидко і невдало голосно. - Niels Bom
Якщо ви написали Javascript вбудованим у файли HTML, запустіть кожен новий блок за допомогою <script>"use strict";. Прапор застосовується тільки до того блоку, в якому воно включено. - nobar
Це смішно, це призвело до того, що рядки мають мати одиночні лапки. Так пишіть 'use strict'; замість цього - nilsi
то що станеться з концепцією підйому JavaScript? - Sunil Sharma
@SunilSharma Якщо ви намагаєтеся підняти, але це не вдається, тому що змінна не визначена, на даний момент він додасть його до глобального об'єкта. З "use strict";, воно не вийде замість. Це має сенс, тому що якщо він додає його до глобального об'єкта, це означає, що він може не працювати при наступному запуску функції / зробити щось інше, яке скидає блок, так як він буде в найвищому блоці (глобальний). - wizzwizz4


Заява "use strict"; вказує браузеру використовувати строгий режим, який є меншим і безпечним набором функцій JavaScript.

Перелік функцій (невичерпний)

  1. Заборонити глобальні змінні. (Зловмисник відсутній var декларації та помилки в іменах змінної)

  2. Безмовні невдалі призначення викличе помилку в суворій режимі (assigning NaN = 5;)

  3. Спроба видалити непотрібні властивості буде кидати (delete Object.prototype)

  4. Потрібно, щоб всі імена властивостей об'єкта буквально були унікальними (var x = {x1: "1", x1: "2"})

  5. Імена параметрів функцій повинні бути унікальними (function sum (x, x) {...})

  6. Заборонити вісім синтаксису (var x = 023; Деякі прихильники помиляються, що попередній нуль не змінює нічого.)

  7. Забороняє with ключове слово

  8. eval в строгому режимі не вводить нові змінні

  9. Заборонити видаляти прості імена (delete x;)

  10. Забороняє зв'язування або присвоєння імен eval і arguments в будь-якій формі

  11. Строгий режим не псевдонім властивостей arguments об'єкт з формальними параметрами. (тобто в function sum (a,b) { return arguments[0] + b;} Це працює тому, що arguments[0] зобов'язаний a і так далі. )

  12. arguments.callee не підтримується

[Посилання: Строгий режим, Мережа розробників Mozilla]


519
2017-11-24 21:22



Nit: глобальні змінні дозволяються, просто повинні бути явними (наприклад, window.foo = bar) - gcampbell
Потрібно, щоб всі властивості властивостей об'єкта буквально були унікальними (var x = {x1: "1", x1: "2"}) - це дійсно - Arun Killu
У вашому прикладі в 11 відсутня модифікація a (інакше це не має сенсу). І. е. сума функції (a, b) {a = 0; повернути аргументи [0] + b; } сповіщення (сума (1, 2)) поверне 3 зі строгим режимом і 2 без суворого режиму, через псевдонім. - David Gausmann
ви просто врятували мене пару годин налагодження за номером 6 - jazzcat


Якщо люди турбуються про використання use strict це може бути варто перевірити цю статтю:

ECMAScript 5 "Строгий режим" підтримка в браузерах. Що це значить?
NovoGeek.com - веб-журнал Крішни

Вона говорить про підтримку браузера, але, що важливіше, як правильно боротися з ним:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

369
2017-07-15 23:25



Я не погоджуюсь. Я думаю, це показує, чому його дуже корисно. По суті це означає, що це повертає свою функцію, а не window - Jamie Hutber
коли ти коли-небудь хочеш вікно з this що ви не можете орієнтуватися window? - Jamie Hutber
Це відноситься до себе. this належить до своєї функції, а не до глобального вікна - Jamie Hutber
У другому this один насправді undefined. - Broxzier
Справа в тому, що ваша програма JS почне не вдаватися через доступ до властивості невизначеною, а не тихо робити невірне в глобальному об'єкті. Робить відстеження тонких помилок набагато простіше. - Stephen Chung


Словом обережності, усім вам, хто заряджає програмістів: застосував "use strict" до існуючого коду може бути небезпечним! Ця річ не є деяким відчуттям хорошого, щасливого обличчя, що ви можете ляпати на код, щоб зробити його "кращим". З "use strict" Прагма, браузер раптово вичерпає винятки в випадкових місцях, які він ніколи не кидав раніше, тому що на цьому місці ви робите щось, що за замовчуванням / втратити JavaScript щасливо дозволяє, але жорсткий JavaScript бентежить! Ви можете мати порушення строгості, які ховаються в рідко використовуваних дзвінках у вашому коді, які тільки викинуть виняток, коли вони в кінцевому підсумку почнуть бігати - скажімо, у виробничому середовищі, що використовують ваші платні клієнти!

Якщо ви збираєтеся зануритися, це гарна ідея застосувати "use strict" поряд із комплексними тестуваннями одиниць і строго налаштованою задачею збірки JSHint, яка дасть вам певну впевненість в тому, що немає темного кута вашого модуля, який буде жахливо підірвати лише тому, що ви включили строгий режим. Або, привіт, ось ще один варіант: просто не додавайте "use strict" до будь-якого зі своїх застарілих кодів, це, напевно, безпечніше, таким чином, чесно. ДЕПЕЧНО НЕ додати "use strict" на будь-які модулі, які ви не володієте або підтримуєте, як-от сторонні модулі.

Я думаю, навіть якщо це смертельна клітина тварина, "use strict" може бути хорошим матеріалом, але ви повинні зробити це правильно. Найкращий час іти строго, коли ваш проект є зеленим полем, і ви починаєте з нуля. Налаштувати JSHint/JSLint з усіма попередженнями та варіантами, які піднімаються настільки тісно, ​​як ваша команда може живіт, одержати хорошу систему складання / тестування / затвердження системи du jour, як фальсифікація Grunt+Karma+Chai, і тільки ТОГДА починайте маркувати всі ваші нові модулі як "use strict". Будьте готові вилікувати безліч помилкових помилок і попереджень. Переконайтеся, що всі розуміють тяжкість, налаштовуючи конструкцію на FAIL, якщо JSHint/JSLintвиробляє будь-які порушення.

Мій проект не був проектом greenfield, коли я прийняв "use strict". У результаті моя IDE насичена червоними позначками, тому що у мене немає "use strict" на половині моїх модулів, і JSHint скаржиться на це. Це нагадування про те, що рефакторинг я повинен робити в майбутньому. Моя мета полягає в тому, щоб бути вільною від маркерів через відсутність у мене "use strict" заяви, але це вже кілька років.


182
2018-03-03 07:37



ЧОМУ розробники в цій темі настільки кавалер про "використовувати строгі" ?? Це ПОШИРЮЄ ВИКЛЮЧЕННЯ в інакше працювати JavaScript, бо боже! Просто посипайте його на коді, як цукор на Кукурудзяні пластівці, а? НЕМАЄ! Погано! "Використовуйте суворі" слід використовувати обережно, бажано лише в коді, який ви контролюєте, що має модульні тести, які проходять у всіх основних браузерах і виконують всі шляхи коду. Ви отримали тести? Гаразд, "Використовуйте суворі", це добре для вас, вибити себе. - DWoldrich
Так. Очевидно, що "Використовуйте суворі" може перервати, здавалося б, дійсний JavaScript, який раніше не зламався. Але код, який не зламався раніше, не дорівнює правильному коду і робить те, що він повинен. Зазвичай посилання на незадекларовані змінні сигналізують про помилку і т. Д. Використовуйте строгу, що дозволяє зловити такі помилки, і, сподіваюсь, перш ніж надсилати код виробництва. - Jostein Kjønigsen
... або просто застосуйте "Використовуйте суворі" як частину останнього переходу на свій код, виправте всі очевидні проблеми, здиріться, скажіть "досить добре", а потім виведіть його на випуск :) - Wolfie Inu
Особисто я ніколи / дуже рідко додати  "use strict"; до існуючого коду. Що сказати, я майже завжди використовую його, коли я пишу новий код з нуля - Martin
Якщо ви вже використовуєте JSLint, ви, напевно, встановили більшість місць, де "використавши строгу" буде порушено речі. - Jonathan Cast


Використовуючи 'use strict'; не раптом зробить ваш код кращим.

The Суворе режимі JavaScript це функція в ECMAScript 5. Ви можете включити суворий режим, оголосивши це у верхній частині вашого сценарію / функції.

'use strict';

Коли движок JavaScript бачить це директива, він почне інтерпретувати код у спеціальному режимі. У цьому режимі помилки виявляються виявленими, коли виявляються певні методи кодування, які можуть призвести до виявлення потенційних помилок (що є підставою для суворого режиму).

Розглянемо цей приклад:

var a = 365;
var b = 030;

У своїй одержимості, щоб скласти числові літерали, розробник випадково ініціалізував змінну b з восьмим буквальним буквою. Нестрогий режим інтерпретує це як числовий буквені з значенням 24 (в базі 10). Проте жорсткий режим викине помилку.

Для неповного переліку спеціальностей в строгому режимі див ця відповідь.


Де я повинен користуватися 'use strict';?

  • В моєму новий Додаток для JavaScript: Абсолютно! Чіткий режим може використовуватися як інформатор, коли ви робите щось дурне з вашим кодом.

  • В моєму існуючий Код JavaScript: Напевно, ні! Якщо ваш існуючий код JavaScript містить заяви, заборонені в суворій режимі, програма просто розірватиметься. Якщо ви хочете суворого режиму, ви повинні бути готові до налагодження та виправлення існуючого коду. Ось чому використовуючи 'use strict'; не раптом зробить ваш код кращим.


Як використовувати суворий режим?

  1. Вставте a 'use strict'; Заява на вершині вашого сценарію:

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....
    

    Зауважте, що все в файлі myscript.js буде інтерпретовано в суворій режимі.

  2. Або вставте a 'use strict'; Заява на вершині тіла вашої функції:

    function doSomething() {
        'use strict';
        ...
    }
    

    Все в лексична сфера функції doSomething буде інтерпретовано в суворій режимі. Слово лексична сфера тут важливо. Побачити ця відповідь для кращого пояснення.


Які речі заборонено в строгому режимі?

Я знайшов a хороша стаття описуючи кілька речей, які заборонені в суворій режимі (зверніть увагу, що це не ексклюзивний список):

Сфера застосування

Історично, JavaScript було плутано про те, як функціонує   орієнтовані Іноді вони здаються статичними, але деякі   Функції роблять їх поведінкою, як вони динамічно орієнтуються. Це   заплутування, ускладнення читання та розуміння програм.   Нерозуміння викликає помилки. Це також є проблемою для продуктивності.   Статичне обчислення дозволить змінити зв'язування, яке відбудеться при складанні   час, але вимога до динамічного масштабу означає, що зобов'язання має бути   відкладений на виконання, який поставляється з значною продуктивністю   штраф

Чіткий режим вимагає, щоб всі змінні зв'язування виконувалися статично.   Це означає, що функції, які раніше вимагали динамічного зв'язування   повинні бути усунені або змінені. Зокрема, з твердженням є   усувається, і здатність eval функції втрутитися в   оточення його абонента суворо обмежене.

Однією з переваг суворого коду є те, що інструменти, такі як Компресор YUI   може обробляти його краще.

Непрямі глобальні змінні

JavaScript має на увазі глобальні змінні. Якщо   ви не явно оголошуєте змінну, глобальною змінною є   неявно оголосили за вас. Це полегшує програмування   початківців, тому що вони можуть нехтувати деякими основними методами ведення домашнього господарства   господарські роботи. Але це робить управління більшими програмами набагато більше   важко, і це значно знижує надійність. Так в строгому порядку   Режим, передбачувані глобальні змінні більше не створюються. Ти повинен   явно оголосити всі ваші змінні.

Глобальна витока

Існує ряд ситуацій, які можуть спричинити this   бути пов'язаним з глобальним об'єктом. Наприклад, якщо ви забудете   забезпечити new префікс при виклику функції конструктора,   конструкторський this буде неочікувано пов'язаний з глобальним об'єктом, так що   замість того, щоб ініціалізувати новий об'єкт, він буде мовчазним   втручання в глобальні змінні. У таких ситуаціях суворий режим буде   замість того, щоб зв'язати this до undefined, що призведе до конструктора   замість цього викиньте виняток, дозволяючи значно виявляти помилку   рано

Шумна невдача

У JavaScript завжди було лише властивості для читання, але ви   не могла створити їх до ES5 Object.createProperty   Функція піддається цій здатності. Якщо ви намагалися присвоїти значення   до властивості лише для читання, вона не зможе тихо. Завдання було б   не змінювати значення властивості, але ваша програма буде продовжуватися як   хоча це було. Це небезпека цілісності, яка може спричинити запуск програм   йти в непослідовний стан. У строгому режимі, намагаючись змінити a   Властивість лише для читання виключить.

Восьмий

Восьмеричне (або база 8) представлення цифр було надзвичайно   корисно при виконанні машинного рівня програмування на машинах чиї слова   розміри були кратними на 3. Ви потребували вісімкових при роботі з CDC   6600 мейнфрейм, розмір шрифту якого складав 60 біт. Якщо б ти міг прочитати   восьмий, можна було б поглянути на слово, як 20 цифр. Два цифри представлені   код оп, а одна цифра визначила один з 8 регістрів. Під час   повільний перехід від машинних кодів до мов високого рівня, це було   вважається корисним для забезпечення вісімкових форм на мовах програмування.

У С, надзвичайно невдалим уявленням восьмерицтва було   вибрано: провідний нуль. Так в С, 0100 означає 64, а не 100, і 08 є   помилка, а не 8. Ще, на жаль, цей анахронізм був   скопійована майже на всі сучасні мови, включаючи JavaScript, де   він використовується лише для створення помилок. Це не має іншої мети. Так в   суворий режим, вісімкові форми більше не допускаються.

Et cetera

Аргументи псевдо масиву стають трохи більше   масив, подібний до ES5. У строгому режимі вона втрачає свою callee і caller   властивості Це дає змогу передавати ваш arguments щоб не довіряти   код, не відмовляючись від багато конфіденційного контексту. Крім того,    arguments властивість функцій усувається.

У суворій режимі дублікати ключів в буквальному призначенні функції зроблять a   синтаксична помилка. Функція не може мати два параметри з однаковим ім'ям.   Функція не може мати змінну з таким самим ім'ям, як і її   параметри Функція не може delete його власні змінні. Спроба    delete Неконфігурована властивість тепер видає виняток. Примітивний   значення непрямо загорнуті.


Резервні слова для майбутніх версій JavaScript

ECMAScript 5 додає список зарезервованих слів. Якщо ви використовуєте їх як змінні або аргументи, строгий режим викине помилку. Забезпечені слова:

implements, interface, let, package, private, protected, public, static, і yield


Подальше читання


131
2018-01-29 11:35



це дуже хороше пояснення. Однак у мене є сумніви, що я можу використовувати "суворий" режим у поєднанні з іншими бібліотеками сценаріїв Java, такими як Angular js? - UVM
@UVM: директива строгого режиму впливає тільки на лексичну сферу. тобто лише файл / функція, яку вона оголошена. Якщо у вас є інший файл / функція, яка не має 'use strict' Директива, вони будуть виконуватися в несистемному режимі, навіть якщо викликати з функції, що працює в суворій режимі. Побачити це asnwer для пояснення. - Krumia
дякую за пояснення Я розумію, що "суворий" режим впливає тільки на "код", а не його "виконання" - UVM
На другому погляді, ти маєш рацію. Я думав, що ви мали на увазі, що він виключає лише винятки, але не змінював роботу коду (наприклад, зміни this) Тепер я бачу, що ви мали на увазі виклик інших функцій. - CyberEd
Є деякі випадки, коли вісімкові корисні. Синтаксис C для нього жахливий, але я хотів би, щоб мови додавали новий восьмий синтаксис, який могло б дозволити, щоб попередня нульова форма була застарілою. Звичайно, для того, щоб Javascript підтримував лідируючу нульову форму, було просто нерозумно. - supercat


Я настійливо рекомендую кожному розробнику зараз почати використовувати суворий режим. Існує достатньо браузерів, які підтримують його, що суворий режим може законно допомогти врятувати нас від помилок, які ми навіть не знали, були у вашому коді.

Очевидно, на початковому етапі станеться помилка, яку ми ніколи не зустрічали раніше. Щоб отримати повну вигоду, ми повинні зробити належне тестування після переходу на суворий режим, щоб переконатися, що ми справили все. Напевно, ми не просто кидаємо use strict в нашому коді і припустимо, що помилок немає. Отже, слід сказати, що пора почати використовувати цю неймовірно корисну функцію мови для написання кращого коду.

Наприклад,

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLint це відладчик, написаний Дугласом Крокфордом. Просто вставте у свій скрипт, і він швидко скануватиме будь-які помітні проблеми та помилки у вашому коді.


122
2017-07-05 19:38



@JamieHutber: Будь ласка, відвідайте цю посилання caniuse.com/use-strict  І kangax.github.io/es5-compat-table. Це дасть точну ідею для всього браузера. - Pank


Я хотів би запропонувати дещо більш обґрунтовану відповідь, доповнюючи інші відповіді. Я сподівався редагувати найпопулярнішу відповідь, але не вдалося. Я спробував зробити це якомога повноцінним і повним.

Ви можете звернутися до MDN документація для отримання додаткової інформації.

"use strict" Директива, представлена ​​в ECMAScript 5.

Директиви подібні до тверджень, але різні.

  • use strict не містить ключових слів: директива є простим вираженням, яке складається з спеціального літеру рядка (в одиночних або подвійних лапках). Драйвера JavaScript, які не реалізують ECMAScript 5, просто бачать вираження заяву без побічних ефектів. Очікується, що в майбутньому будуть представлені версії стандартів ECMAScript use як справжнє ключове слово; тоді котирування стануть застарілими.
  • use strict може бути використаний лише на початку скрипту або функції, тобто вона повинна передувати будь-якому іншому (реальному) твердженню. Це не повинно бути першим вказівником у скрипті функції: для нього можуть передувати інші вирази операторів, які складаються з рядкових літералів (і реалізації JavaScript можуть розглядати їх як конкретні директиви для реалізації). Висловлювання рядкових літералів, які слідують за першим реальним твердженням (у скрипті або функції), є простими операторами вираження. Перекладачі не повинні інтерпретувати їх як директиви, і вони не мають ніякого ефекту.

The use strictДиректива показує, що наступний код (у скрипті або функції) - це строгий код. Код на найвищому рівні скрипта (код, який не входить до функції) вважається суворим кодом, коли скрипт містить a use strict директива Зміст функції вважається суворим кодом, коли сама функція визначена в суворій коді або коли функція містить a use strict директива Код, який передається до eval() метод вважається суворим кодом, коли eval() був викликаний з суворого коду або містить use strict сама директива.

Суворий режим ECMAScript 5 - це обмежене підмножина мови JavaScript, що усуває релевантні дефіцити мови, а також більш суворих перевірок помилок та підвищення безпеки. Нижче перераховані відмінності між строгим режимом та нормальним режимом (з яких перші три особливо важливі):

  • Ви не можете використовувати with-видання в строгому режимі.
  • У суворій режимі всі змінні повинні бути оголошені: якщо ви призначаєте значення ідентифікатору, який не був оголошений як змінна, функція, параметр функції, параметр catch-clause або властивість глобальної Object, то ви отримаєте a ReferenceError. У звичайному режимі ідентифікатор неявно оголошується глобальною змінною (як властивістю глобальної Object)
  • У строгому режимі ключове слово this має значення undefined у функціях, які були викликані як функції (а не як методи). (У нормальному режимі this завжди вказує на глобальний Object) Ця різниця може бути використана для перевірки, якщо реалізація підтримує суворий режим:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Також, коли викликається функція call() або apply в строгому режимі, потім this це саме значення першого аргументу call()або apply() виклик (У нормальному режимі null і undefined замінюються глобальними Object і значення, які не є об'єктами, вводяться в об'єкти).

  • У строгому режимі ви отримаєте a TypeError, коли ви намагаєтесь присвоїти властивостям для читання або визначити нові властивості для нерозширюваного об'єкта. (У звичайному режимі обидва просто виходять з ладу без повідомлення про помилку.)

  • У строгому режимі при передачі коду до eval(), ви не можете оголосити або визначити змінні або функції в межах сфери дії абонента (як це можна зробити в звичайному режимі). Замість цього створюється новий обсяг eval() і змінні та функції знаходяться в межах цієї сфери. Цей обсяг знищено після eval() закінчує виконання.
  • У суворій режимі аргумент-об'єкт функції містить статичну копію значень, які передаються цій функції. У звичайному режимі аргумент-об'єкт має дещо "магічну" поведінку: елементи масиву та названі параметри функції посилаються на одне й те саме значення.
  • У строгому режимі ви отримаєте a SyntaxError коли delete За оператором ідентифікується невизначений ідентифікатор (параметр змінної, функції або функції). У звичайному режимі delete вираз нічого не зробить і оцінюватиметься false.
  • У строгому режимі ви отримаєте a TypeError коли ви намагаєтесь видалити не налаштовуване властивість. (У звичайному режимі спроба просто не вдається і deleteвираз оцінюється до false)
  • У суворій режимі це вважається синтаксичною помилкою, коли ви намагаєтесь визначити кілька властивостей з тим самим ім'ям для об'єкта літерального. (У звичайному режимі немає помилок.)
  • У суворій режимі вважається синтаксичною помилкою, коли декларація функції має декілька параметрів з однаковим ім'ям. (У звичайному режимі немає помилок.)
  • У строгому режимі вісімкові літерали не допускаються (це літералі, що починаються з 0x. (У нормальному режимі деякі реалізації дозволяють вісімкові літери.)
  • У строгому режимі ідентифікатори eval і arguments розглядаються як ключові слова. Ви не можете змінити їх значення, не можете призначити їм значення, і ви не можете використовувати їх як імена для змінних, функцій, функціональних параметрів або ідентифікаторів блокування.
  • У строгому режимі є більше обмежень на можливості вивчення стек дзвінка. arguments.caller і arguments.callee викликати a TypeError в функції в строгому режимі. Крім того, деякі характеристики caller-і аргументів функцій в строгому режимі викликають a TypeError коли ти намагаєшся їх прочитати.

81
2018-05-15 06:58



"У строгому режимі вісімкові літери не допускаються (це літералі, які починаються з 0x ...)" восьминні літерали починаються з провідного 0. - Alex Gittemeier


Мої два центи:

Одна з цілей строгого режиму полягає у тому, щоб дозволити швидше налагоджувати проблеми. Це допомагає розробникам, викидаючи виняток, коли виникають певні неправильні речі, які можуть викликати мовчазну та дивну поведінку вашої веб-сторінки. Момент ми використовуємо use strict, код викидає помилки, які допомагають розробнику заздалегідь це виправити.

Кілька важливих речей, які я дізнався після використання use strict :

Запобігає глобальній декларації змін:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

Тепер цей код створює nameoftree в глобальному масштабі, до якого можна отримати доступ за допомогою window.nameoftree. Коли ми реалізуємо use strict код буде викидати помилку.

Uncaught ReferenceError: nameoftree не визначено

Зразок

Усуває with заява:

with заяви не можуть бути мінімізовані за допомогою інструментів, таких як uglify-js. Вони теж є не підтримується і вилучено з майбутніх версій JavaScript.

Зразок

Запобігає дублікатах:

Коли ми маємо дублікат властивості, він викидає виняток

Uncaught SyntaxError: Дублювати властивості даних в об'єкті буквальному не   допускається в строгому режимі

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

Є ще трохи, але мені потрібно отримати більше знань про це.


73
2018-03-10 03:31





Якщо ви використовуєте браузер, випущений впродовж останнього року, то, швидше за все, підтримує режим строкового режиму JavaScript. Лише старі оглядачі навколо, перш ніж ECMAScript 5 став поточним стандартом, не підтримують його.

Цитати навколо команди переконайтеся, що кодекс все ще працює в старих браузерах (хоча речі, які генерують синтаксичну помилку в суворій режимі, зазвичай просто спричиняють несправність сценарію в деяких важко виявлених шляхах у цих старих веб-переглядачах).


54
2018-03-27 12:18



Тоді що це робить? - Anish Gupta
... це описує частково сумісність, але не те, що вона насправді робить. - courtsimas