що таке "суворий режим" і як він використовується?


134

Я переглядав посилання JavaScript у Мережі розробників Mozilla, і мені траплялося щось, що називається "strict mode". Я прочитав це, і у мене виникають проблеми з розумінням того, що він робить. Чи може хтось коротко пояснити (загалом), яка його мета і наскільки вона корисна?


Відповіді:


149

Основна його мета - зробити більше перевірки.

Просто додайте "use strict";вгорі коду, перш ніж все інше.

Наприклад, blah = 33;дійсний JavaScript. Це означає, що ви створюєте абсолютно глобальну змінну blah.

Але в суворому режимі його помилка, оскільки ви не використовували ключове слово "var" для оголошення змінної.

Більшу частину часу ви не маєте на увазі створювати глобальні змінні посеред якоїсь довільної області, тому більшість випадків, про які blah = 33пишеться, це помилка, і програміст насправді не хотів, щоб це була глобальна змінна, вони мали на увазі писати var blah = 33.

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

Детальніше читайте на сторінці MDN в суворому режимі


4
це точний дублікат документації на MDN
nkcmr

23
Що ви тоді не розумієте про його корисність? Він спрямований на допомогу розвитку шляхом лову речей, які є дійсними, але найбільш вірогідними помилками.
Саймон Сарріс

34

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

Тож такі речі

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

призведе до помилки, коли privateMethod виклику (оскільки ви не можете додати властивість до нього undefined), а не марно додавати bвластивість до глобального об'єкта.


4
так, потрібно додати privateMethod.bind(this)();і подзвонити зnew jsbin.com
hlcs

Найважливіші обмеження в суворому режимі: docs.microsoft.com/en-us/scripting/javascript/advanced/…
Крішна Мохан,

21

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

Гармонія , яка, сподіваємось, стане наступною основною версією EcmaScript, буде побудована на основі суворої ES5.

Гармонія побудована на жорсткому режимі ES5, щоб уникнути занадто багато режимів.

Деякі інші експерименти з мовою також залежать від суворого режиму. SES залежить від жорсткості режиму ES5.

Проектний експеримент SES (Secure ECMAScript)

Створіть мову програмування можливостей об'єкта, видаливши або відремонтувавши функції в ES5 / Strict.

Повинен бути прямий переклад з SES на ES5 / Strict.

Додаток С до стандарту пояснює відмінності між суворим режимом та звичайним режимом.

Суворе обмеження режиму та винятки

  • Ідентифікатори "реалізує", "інтерфейс", "нехай", "пакет", "приватний", "захищений", "загальнодоступний", "статичний" і "вихід" класифікуються як маркери FutureReservedWord у строгому режимі коду. (7.6.12 [?]).
  • Відповідна реалізація, обробляючи код суворого режиму, не може поширювати синтаксис NumericLiteral (7.8.3), щоб включати OctalIntegerLiteral, як описано в B.1.1.
  • Відповідна реалізація, обробляючи код суворого режиму (див. 10.1.1), може не поширювати синтаксис EscapeSequence, щоб включати OctalEscapeSequence, як описано в B.1.2.
  • Присвоєння незадекларованому ідентифікатору або іншим чином нерозв’язним посиланням не створює властивості у глобальному об’єкті. Коли просте призначення відбувається в рамках суворого коду режиму, його LeftHandSide не повинен оцінюватись до нерозв'язної посилання. Якщо це робиться, викидається виняток ReferenceError (8.7.2). LeftHandSide також не може бути посиланням на властивість даних зі значенням атрибута {[[Writable]]: false}, на властивість accessor зі значенням атрибута {[[Set]]: undefined}, а також на неіснуюче властивість об'єкта, у якого [[Розширювана]] внутрішня властивість має значення false. У цих випадках видається виняток TypeError (11.13.1).
  • Ідентифікатор eval або аргументи можуть не відображатися як LeftHandSideExpression оператора присвоєння (11.13) або PostfixExpression (11.3) або як UnaryExpression, керований префіксальним збільшенням (11.4.4) або оператором префікса (11.4.5) . Об'єкти аргументів для функцій суворого режиму визначають неконфігурувані властивості аксесуара з назвою "caller" та "callee", які передають виключення TypeError під час доступу (10.6).
  • Об'єкти аргументів для функцій суворого режиму динамічно не ділять значення індексованих властивостей масиву з відповідними формальними прив'язками їхніх функцій. (10.6). Для функцій суворого режиму, якщо створений об'єкт аргументів, прив'язка локальних аргументів ідентифікатора до об'єкта аргументів є незмінною, а значить, не може бути цільовим виразом призначення. (10.5).
  • Це SyntaxError, якщо код суворого режиму містить ObjectLiteral з більш ніж одним визначенням будь-якої властивості даних (11.1.5). Це SyntaxError, якщо Ідентифікатор "eval" або Ідентифікатор "аргументи" виникає як Ідентифікатор у PropertySetParameterList of PropertyAssignment, який міститься в строгому коді, або якщо його FunctionBody є строгим кодом (11.1.5).
  • Код eval суворого режиму не може інстанціювати змінні або функції у змінному середовищі виклику, що викликає. Натомість створюється нове змінне середовище, яке використовується для створення прив'язки оголошень для коду eval (10.4.2).
  • Якщо це оцінюється в коді суворого режиму, то це значення не прив'язується до об'єкта. Це значення null або undefined не перетворюється на глобальний об'єкт, а примітивні значення не перетворюються на об'єкти обгортки. Це значення, передане через виклик функції (включаючи виклики, здійснені за допомогою Function.prototype.apply і Function.prototype.call), не примушує передане це значення об'єкту (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
  • Коли оператор видалення відбувається в рамках строгого коду режиму, SyntaxError викидається, якщо його UnaryExpression є прямим посиланням на змінну, аргумент функції або ім'я функції (11.4.1).
  • Коли оператор видалення виникає в коді суворого режиму, передається TypeError, якщо властивість, яку потрібно видалити, має атрибут {[[Configurable]]: false} (11.4.1). Це SyntaxError, якщо VariableDeclaration або VariableDeclarationNoIn зустрічається в межах суворого коду, а його Identifier є eval або аргументами (12.2.1).
  • Код суворого режиму може не включати в себе WithStatement. Виникнення WithStatement у такому контексті є SyntaxError (12.10).
  • Це SyntaxError, якщо TryStatement з Catch відбувається в межах суворого коду, а Ідентифікатор виробництва Catch є eval або аргументами (12.14.1)
  • Це SyntaxError, якщо ідентифікатор eval або аргументи з'являються в FormalParameterList суворого режиму FunctionDeclaration або FunctionExpression (13.1)
  • Функція суворого режиму може не мати двох або більше формальних параметрів, що мають однакову назву. Спроба створити таку функцію за допомогою конструктора FunctionDeclaration, FunctionExpression або Function є SyntaxError (13.1, 15.3.2).
  • Реалізація може не виходити за рамки визначених у цій специфікації значень у функціях суворого режиму властивостей з назвою абонента або аргументів екземплярів функції. Код ECMAScript не може створювати або змінювати властивості з цими іменами на об'єктах функцій, які відповідають функціям суворого режиму (10.6, 13.2, 15.3.4.5.3).
  • SyntaxError - це використання в коді суворого режиму ідентифікаторів eval або аргументів як Ідентифікатор FunctionDeclaration або FunctionExpression або як формальне ім'я параметра (13.1). Спроба динамічно визначити таку функцію суворого режиму за допомогою конструктора функцій (15.3.2) призведе до виключення SyntaxError.

6

ECMAScript 5 ввів поняття суворого режиму .

Викликати суворий режим у коді

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

Весь сценарій:

Скажімо, ми створюємо app.js, тому додавання сценарію використання першого оператора буде застосовувати суворий режим для всього коду.

// app.js whole script in strict mode syntax
use strict”;
// Now you can start writing your code 

Суворий режим функції:

Щоб викликати суворий режим для функції, поставте точне твердження «використовувати строгий»; на початку функції функції перед будь-яким іншим твердженням.

function yourFunc(){
 "use strict";

 // Your function code logic
}

Суворий режим включає кілька змін у звичайну семантику Javascript. Перший суворий режим усуває деякі тихі помилки JavaScript, змінюючи їх для викидання помилок.

Для примірника: Код за допомогою жорсткого режиму

введіть тут опис зображення

У наведеному вище прикладі коду без використання суворого режиму в коді Він не призведе до помилки. Оскільки ми отримуємо доступ до змінної, xне оголошуючи її. Тож у суворому режимі доступ до недекларованої змінної видає помилку.

Тепер спробуємо отримати доступ до змінної x, не оголошуючи її без суворого режиму.

(function(){
    x = 3;
})();

// Will not throw an error

Перевага використання суворого режиму:

  • Усуньте мовчазні помилки JavaScript шляхом помилки кидання.
  • Виправляється помилка, яка ускладнює механізм JavaScript оптимізацію.
  • Зробіть код запускати швидше, ніж ідентичний код, який не знаходиться в суворому режимі
  • Забороняє деякий синтаксис, який, можливо, буде визначений у майбутній версії ECMAScript.

5

Суворий режим вносить кілька змін у звичайну семантику JavaScript.

  • суворий режим виключає деякі тихі помилки JavaScript, змінюючи їх для викидання помилок.

  • суворий режим виправляє помилки, які ускладнюють виконання двигунами JavaScript оптимізації.

  • суворий режим забороняє деякий синтаксис, який, можливо, буде визначений у майбутніх версіях ECMAScript.


1

ECMAScript5 вводить нові об'єкти та властивості, а також т. зв "strict mode" .

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

"use strict";

1

2017 рік, і я нарешті знайшов документацію:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

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


Суворий режим вносить кілька змін у звичайну семантику JavaScript. По-перше, суворий режим усуває деякі мовчазні помилки JavaScript, змінюючи їх для викидання помилок. По-друге, суворий режим виправляє помилки, які ускладнюють оптимізацію двигунів JavaScript: іноді суворий режим режиму може працювати швидше, ніж ідентичний код, який не є строгим режимом. По-третє, суворий режим забороняє деякий синтаксис, який, ймовірно, буде визначений у майбутніх версіях ECMAScript.


0

Запитання.
Слідом за проблемою, з якою я зіткнувся, я стежив за підручником, і в кінцевому підсумку намагався скласти наступний scssфайл і намагався генерувати з нього CSS-код,

.fatty{
  width: percentage(6/7);
}

використовуючи наступне gulpfile.jsзавдання:

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

Тож помилка, яку я отримую, полягає в наступному:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

Рішення:
Отже, він показує мені index.jsфайл, який знаходиться в моєму модулі gulp-sass (який в основному заблокований і не повинен редагуватися). Але якщо я примушуся додати і додаю позначку "use_strict"у верхній частині цього index.jsфайлу, це виконує моє завдання безперебійно.

Я був безпорадним, тому продовжую використовувати це як рішення! Але потім, переглянувши деякі інші питання відповідей, я побачив наступну відповідь :

sudo npm install -g n
sudo n stable

і раніше я оновив свої NodeJs (до Version10.x), а потім відновив Gulp, виконавши наступні команди, як термінал мені наказав:

npm rebuild node-sass --force

І все гаразд. Так ось воно і вирішилось. Я скасовував зміни, внесені для index.jsфайлу модуля gulp. І зараз це працює безперебійно.

Сподіваюся, що ця відповідь буде корисною для когось там!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.