42

A veces veo código que incluye "use strict";. Por ejemplo, muchas bibliotecas comienzan con esto:

(function () {
    "use strict";

¿Qué significa "use strict" y para qué se usa?


En otros idiomas: EnglishРусский

Peter Olson
  • 4,645
  • 3
  • 18
  • 22

2 Answers2

52

"use strict"; (traducción: «usar estricto») es una directiva que activa la ejecución de código en el modo estricto. Sin esta directiva, el programa se ejecuta en el modo irrestricto.

El modo estricto se introdujo en ECMAScript 5, y navegadores viejos (IE9 y menos) no lo soportan. Es decir, lo ignoran y ejecutan todo en el modo irrestricto.

¿Para qué se usa "use strict";?

En el modo estricto,

  • se pueden encontrar algunos errores más temprano,
  • las partes más peligrosas o inútiles de JavaScript están prohibidas o lanzan un error de ejecución.

¿Cómo se usa "use strict";?

Para activar el modo estricto para todo el script, es necesario poner la directiva "use strict"; o 'use strict'; al comienzo.

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

Para activar el modo estricto en una función, es necesario poner la directiva al comienzo de la función.

// 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

¿Cuál es la diferencia entre el modo estricto y el modo irrestricto?

En el modo estricto,

  • no se puede asignar un valor a una variable no definida (especificación §11.13.1). En el modo irrestricto se crea una variable global.

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

    Tampoco se puede asignar un valor a una propriedad de sólo lectura. En el modo estricto se lanza un error, y en el modo irrestricto está ignorada silenciosamente.

    (function() {
      "use strict";
      window.undefined = 5; // TypeError: Cannot assign to read only
    })();                   // property 'undefined' of [object Object]
    
    window.undefined = 5; // No hace nada
    
  • no se puede usar la instrucción with (especificación §12.10).

    (function() {
      "use strict";
      with(Object) {} // SyntaxError: Strict mode code may not include a with statement
    })();
    
  • no se pueden definir propriedades duplicadas en un literal de objeto (especificación §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} 
    
  • no se pueden definir parametros duplicados en una función (especificación §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
    
  • cambios al objeto arguments no cambian los argumentos (especificación §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 lanza un error si el argumento no es una propriedad modificable de un objeto (especificación §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 no puede instanciar variables y funciones fuera de su proprio contexto (especificación §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 no se convierte en un objeto, y si this es undefined o null no se convierte en el objeto global (especificación §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]
    
  • no se pueden usar eval o arguments como nombres (especificación §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
    
  • no se puede usar argument.caller y arguments.callee (especificación §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
    })();
    
  • hay más palabras reservadas para futuras versiones de ECMAScript (especificación §7.6.1.2).

    (function () {
      "use strict";
      var implements, let, private, public, yield, interface, package, protected, static;
    })(); // SyntaxError: Unexpected strict mode reserved word
    
  • no se pueden usar literales en base octal (especificación 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?"
    

Esta respuesta es una traducción de mi respuesta a la misma pregunta en el sitio ruso.

Peter Olson
  • 4,645
  • 3
  • 18
  • 22
4

El uso de use-stric, añade al interprete del navegador como ejecutar el código javascript, esto te obliga a que necesitas declarar las variables antes de poder usarlas, ahora el uso de ellas puede variar, si quieres que afecte global mente, debes usarlo al inicio del código, o si quieres que afecta a una funcion podrías usarlo a continuación de la función

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

en esta función el navegador ejecuta el código sin problema alguno. Pero si adicionamos use-strict.

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

el navegador lanzara un error por no declarar antes la variable, para poder usarla, para ello deberás declarar la variable antes de usarla.

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

}

Esta y muchos criterios hacen parte del use-strict, por ejemplo definir una propiedad dos veces, parámetros duplicados etc, revisa la referencia y encontrás ejemplos

julian salas
  • 773
  • 2
  • 13
  • 23