Что значит “используйте strict”?

Иногда я вижу код, который он включает "use strict";. Например, много библиотек начинаются с этим:

(function () {
    "use strict";

Что значит "используйте strict" и зачем он используется?


На других языках: EnglishРусский

39
задан 23.05.2017, 15:39
2 ответа

"use strict"; (перевод: «использовать строго») - директивный орган, который включает выполнение кода в строгом способе. Без этого директивного органа, программа работает в способе irrestricto.

Строгий способ ввел в ECMAScript 5, и старые браузеры (IE9 и меньше) они это не выносят. А именно, они это игнорируют и выполняют все в способе irrestricto.

Зачем он используется "use strict";?

В строгом способе,

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

Как он используется "use strict";?

Чтобы включать строгий способ для всего рукописного шрифта, необходимо помещать директивный орган "use strict"; или 'use strict'; в начале.

"use strict";
// el código aquí se ejecuta en el modo estricto

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

// el código aquí se ejecuta en el modo irrestricto
function f() {
  "use strict";
  // el código aquí se ejecuta en el modo estricto
}
// el código aquí se ejecuta en el modo irrestricto

Каково различие между строгим способом и способом irrestricto?

В строгом способе,

  • не возможно распределять стоимость в не определенную переменную (спецификация §11.13.1). В способе irrestricto создается глобальная переменная.

    (function() {
      "use strict";
      x = 5; // ReferenceError: x is not defined
    })(); 
    
    x = 5; // crea la variable global x
    

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

    (function() {
      "use strict";
      window.undefined = 5; // TypeError: Cannot assign to read only
    })();                   // property 'undefined' of [object Object]
    
    window.undefined = 5; // No hace nada
    
  • не возможно использовать инструкцию with (спецификация §12.10).

    (function() {
      "use strict";
      with(Object) {} // SyntaxError: Strict mode code may not include a with statement
    })();
    
  • они не могут определяться propriedades удвоенные в буквальном объекта (спецификация §11.1.5).

    (function() {
      "use strict";
      var x = {
        a: 1,
        a: 2
      };  // SyntaxError: Duplicate data property in object literal 
    })(); // not allowed in strict mode
    
    var x = {
      a: 1,
      a: 2
    }; // x es igual a {a: 2} 
    
  • не могут определяться параметры, удвоенные в функции (спецификация §13.1, §15.3.2).

    function f(a, a) {
      "use strict";
    } // SyntaxError: Strict mode function may not have duplicate parameter names
    
    function f(a, a) {
      return a;
    }
    f(1,2); // regresa 2
    
  • изменения в объект arguments они не меняют аргументы (спецификация §10.6).

    function f(x) {
      "use strict";
      arguments[0] = 5;
      return x;
    }
    f(10); // regresa 10
    
    function f(x) {
      arguments[0] = 5;
      return x;
    }
    f(10); // regresa 5
    
  • delete брось ошибку, если аргумент не изменяемый propriedad объекта (спецификация §11.4.1).

    (function f(x) {
      "use strict";
      var y = 4;
      delete f; // SyntaxError: Delete of an unqualified identifier in strict mode.
      delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.
      delete y; // SyntaxError: Delete of an unqualified identifier in strict mode.
      delete window.undefined; // TypeError: Cannot delete property 
    })();                      // 'undefined' of [object Object]
    
    (function f(x) {
      var y = 4;
      delete f; // regresa false
      delete x; // regresa false
      delete y; // regresa false
      delete window.undefined; // regresa false
    })();
    
  • eval не может instanciar переменные и функции вне Вашего proprio контекст (спецификация §10.4.2).

    (function () {
      "use strict";
      eval("var x = 5");
      return x; // ReferenceError: x is not defined
    })();
    
    (function () {
      eval("var x = 5");
      return x;
    })(); // regresa 5
    
  • this он не превращается в объект, и если this он undefined или null он не превращается в глобальный объект (спецификация §10.4.3).

    function f() {
      "use strict";
      return this;
    };
    f.call(4); // regresa 4
    f.call(null); // regresa null
    f.call(undefined); // regresa undefined
    
    function f() {
      return this;
    };
    f.call(4); // regresa [object Number]
    f.call(null); // regresa [object global]
    f.call(undefined); // regresa [object global]
    
  • они не могут быть использованными eval или arguments как имена (спецификация §11.4.4, §11.4.5, §11.13, §12.2.1, §12.10, §12.14.1, §13.1).

    function eval(arguments) {     // SyntaxError: Unexpected eval or arguments in strict mode
      "use strict";
      eval = "5";                  // SyntaxError: Unexpected eval or arguments in strict mode
      ++eval;                      // SyntaxError: Unexpected eval or arguments in strict mode
      arguments++;                 // SyntaxError: Unexpected eval or arguments in strict mode
      try {
        var arguments = 5;         // SyntaxError: Unexpected eval or arguments in strict mode
      } catch(eval) {}             // SyntaxError: Unexpected eval or arguments in strict mode
      return arguments.eval;
    }
    
    function eval(arguments) {
      eval = "5";
      ++eval;
      arguments++;
      try {
        var arguments = 5;
      } catch(eval) {}
      return arguments.eval;
    }
    eval(); // regresa 5
    
  • не возможно использовать argument.caller и arguments.callee (спецификация §13.2).

    (function f() {
      "use strict";
      arguments.caller; // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
      arguments.callee; // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
      f.arguments;      // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
    })();
    
  • есть больше слов, размещенных для будущих версий ECMAScript (спецификация §7.6.1.2).

    (function () {
      "use strict";
      var implements, let, private, public, yield, interface, package, protected, static;
    })(); // SyntaxError: Unexpected strict mode reserved word
    
  • они не могут быть использованными буквальные в основании octal (спецификация B.1.1, B.1.2).

    (function () {
      "use strict";
      return 010 + // SyntaxError: Octal literals are not allowed in strict mode.
        "\077";    // SyntaxError: Octal literals are not allowed in strict mode.
    })();
    
    (function () {
      return 010 + "\077";
    })(); // regresa "8?"
    

Этот ответ - перевод моего ответа на тот же вопрос в русском сайте.

44
ответ дан 01.12.2019, 08:11

Использование use-stric, добавь переводчика браузера, как выполнение кода javascript, это вынуждает тебя к, которые ты нуждаешься в том, чтобы признать переменными перед тем, как мочь использовать их, сейчас использование их смоги меняться, если ты хочешь, чтобы он затронул глобальный разум, ты должен использовать это в начало кода, или если ты хочешь, что он касается функции, ты мог бы использовать это далее функции

function showData(){
  var msj = "welcome";
  alert(msj)
}

в этой функции браузер выполняет код без какой-либо проблемы. Но если мы добавляем, используйте - strict.

function showData(){
  "use strict";
  msj = "welcome";
  alert(msj)
}

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

function showData(){
  "use strict";
  var msj = "welcome";
  alert(msj);

}

Будь и много критериев заставляют часть use-strict, например определять свойство два раза, дублированных параметра и т.д., проверь ссылку и encontrás примеры

3
ответ дан 01.12.2019, 08:11