Что делает «использование строгого» в JavaScript, и каковы причины этого? - PullRequest
7174 голосов
/ 26 августа 2009

Недавно я выполнил часть своего кода JavaScript через JSLint Крокфорда, и он выдал следующую ошибку:

Проблема в строке 1, символ 1: отсутствует выражение "использовать строгий".

Занимаясь поиском, я понял, что некоторые люди добавляют "use strict"; в свой код JavaScript. Как только я добавил заявление, ошибка перестала появляться. К сожалению, Google не раскрыл большую часть истории этого строкового утверждения. Конечно, это как-то связано с тем, как браузер интерпретирует JavaScript, но я понятия не имею, каков будет эффект.

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

Отвечает ли текущий браузер строке "use strict"; или она предназначена для использования в будущем?

Ответы [ 26 ]

55 голосов
/ 23 декабря 2015

При добавлении "use strict"; в следующих случаях будет SyntaxError перед выполнением сценария:

  • Проложить путь для будущих версий ECMAScript , используя одно из вновь зарезервированных ключевых слов (в преддверии ECMAScript 6 ): implements, interface, let, package, private, protected, public, static и yield.

  • Объявление функции в блоках

    if(a<b){ function f(){} }
    
  • Восьмеричный синтаксис

    var n = 023;
    
  • this указывают на глобальный объект.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • Объявление дважды одинакового имени для имени свойства в литерале объекта

     {a: 1, b: 3, a: 7} 
    

    Это больше не относится к ECMAScript 6 ( ошибка 1041128 ).

  • Объявление двух аргументов функции с одинаковым именем функции

    f(a, b, b){}
    
  • Установка значения в необъявленную переменную

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • Использование delete для имени переменной delete myVariable;

  • Использование eval или arguments в качестве имени аргумента переменной или функции

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    

Источники:

51 голосов
/ 27 марта 2014

Строгий режим вносит несколько изменений в обычную семантику JavaScript:

  • устраняет некоторые скрытые ошибки JavaScript, изменяя их бросать ошибки.

  • исправляет ошибки, затрудняющие JavaScript двигатели для выполнения оптимизаций.

  • запрещает некоторый синтаксис, который может быть определен в будущем версии ECMAScript.

для получения дополнительной информации vistit Строгий режим - Javascript

49 голосов
/ 31 мая 2013

«Строгое использование»; это гарантия того, что программист не будет использовать плохие или плохие свойства JavaScript. Это руководство, так же, как правитель поможет вам сделать прямые линии. «Use Strict» поможет вам сделать «прямое кодирование».

Те, кто предпочитает не использовать линейки для прямой обработки строк, обычно оказываются на тех страницах, где просят других отладить их код.

Поверь мне. Затраты незначительны по сравнению с плохо разработанным кодом. У Дуга Крокфорда, который несколько лет был старшим разработчиком JavaScript, есть очень интересный пост здесь . Лично мне нравится все время возвращаться на его сайт, чтобы убедиться, что я не забыл свою хорошую практику.

Современная практика JavaScript всегда должна вызывать «строгое использование»; pragma. Единственная причина, по которой группа ECMA сделала необязательный режим "1011" , заключается в том, чтобы предоставить менее опытным кодировщикам доступ к JavaScript и дать время для адаптации к новым и более безопасным методам кодирования.

44 голосов
/ 05 сентября 2014

Включение use strict в начало всех ваших чувствительных файлов JavaScript с этой точки зрения - небольшой способ стать лучшим программистом JavaScript и избежать случайного изменения глобальных переменных и изменения в молчании.

38 голосов
/ 29 апреля 2015

Цитата из w3schools :

Директива об использовании строго

Директива «use strict» появилась в JavaScript 1.8.5 впервые (ECMAScript версия 5).

Это не утверждение, а буквальное выражение, игнорируемое ранее версии JavaScript.

Цель «использовать строгое» - указать, что код должен быть выполнен в "строгом режиме".

В строгом режиме нельзя, например, использовать необъявленные переменные.

Почему строгий режим?

Строгий режим облегчает написание «безопасного» JavaScript.

Строгий режим изменяет ранее принятый «плохой синтаксис» на реальные ошибки.

Например, в обычном JavaScript неправильный ввод имени переменной создает новая глобальная переменная. В строгом режиме это вызовет ошибку, делая невозможным случайное создание глобальной переменной.

В обычном JavaScript разработчик не получит никаких сообщений об ошибках присвоение значений не записываемым свойствам.

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

Пожалуйста, обратитесь к http://www.w3schools.com/js/js_strict.asp, чтобы узнать больше

33 голосов
/ 22 мая 2017

"use strict" делает код JavaScript для запуска в строгом режиме , что в основном означает, что все должно быть определено перед использованием. Основная причина использования строгого режима состоит в том, чтобы избежать случайного глобального использования неопределенных методов.

Также в строгом режиме все работает быстрее, некоторые предупреждения или тихие предупреждения приводят к фатальным ошибкам, лучше всегда использовать его для создания более аккуратного кода.

"use strict" широко требуется для использования в ECMA5, в ECMA6 по умолчанию является частью JavaScript , поэтому его не нужно добавлять, если вы используете ES6.

Посмотрите на эти утверждения и примеры из MDN:

Директива "использовать строгое"
Директива "использовать строгое" является новой в JavaScript 1.8.5 (ECMAScript версия 5). Это не утверждение, а буквальное выражение, игнорируемое более ранними версиями JavaScript. Цель «использовать строгое» - указать, что код должен быть выполнен в "строгом режиме". Со строгим режимом нельзя, например, используйте необъявленные переменные.

Примеры использования «use strict»:
Строгий режим для функций: аналогично, для вызова строгого режима для функция, поставьте точное утверждение «используйте строгий»; (или «используйте строгий»;) в тело функции перед любыми другими утверждениями.

1) строгий режим в функциях

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) строгий режим всего сценария

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) Присвоение глобальному незаписываемому элементу

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

Вы можете узнать больше на MDN .

29 голосов
/ 29 марта 2014

Некоторые люди, которые были в комитете ECMAScript, хорошо говорят: Изменения в JavaScript, Часть 1: ECMAScript 5 " о том, как постепенное использование переключателя "use strict" позволяет разработчикам JavaScript очищать множество опасных функций JavaScript без внезапного взлома любого веб-сайта в мире.

Конечно, в нем также говорится о том, каковы были многие из этих ошибок, и как ECMAScript 5 их исправляет.

20 голосов
/ 22 августа 2016

Маленькие примеры для сравнения:

Нестрогий режим:

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

Строгий режим:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

Нестрогий режим:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true
18 голосов
/ 12 апреля 2016

Обратите внимание, что use strict был введен в EcmaScript 5 и с тех пор хранился.

Ниже приведены условия для запуска строгого режима в ES6 и ES7 :

  • Глобальный код является кодом строгого режима, если он начинается с Пролога Директивы, который содержит Директиву строгого использования (см. 14.1.1).
  • Код модуля всегда является кодом строгого режима.
  • Все части ClassDeclaration или ClassExpression являются кодами строгого режима.
  • Код Eval - это код строгого режима, если он начинается с Пролога директивы, который содержит директиву Use Strict, или если вызов eval является прямым eval (см. 12.3.4.1), который содержится в коде строгого режима.
  • Код функции - это код строгого режима, если связанный FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition или ArrowFunction содержится в коде строгого режима или если код, который создает значение функции [[ECMAScriptCode ]] внутренний слот начинается с пролога директивы, который содержит директиву строгого использования.
  • Код функции, который предоставляется в качестве аргументов для встроенных конструкторов Function и Generator, является кодом строгого режима, если последний аргумент является строкой, которая при обработке является FunctionBody , которая начинается с директивного пролога, который содержит директиву о строгом использовании.
12 голосов
/ 18 ноября 2016

Основные причины, по которым разработчики должны использовать "use strict":

  1. Предотвращает случайное объявление глобальных переменных. Использование "use strict()" обеспечит, чтобы переменные были объявлены с var перед использованием. Например:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
    
  2. N.B: директива "use strict" распознается только в начале скрипта или функции.
  3. Строка "arguments" не может использоваться в качестве переменной:

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. Ограничит использование ключевых слов в качестве переменных. Попытка их использования приведет к ошибкам.

Короче говоря, ваш код будет менее подвержен ошибкам и, в свою очередь, заставит вас писать хороший код.

Чтобы узнать больше об этом, вы можете обратиться здесь .

...