Variante restrictive de JavaScript introduite par ECMAScript version 5 pour être plus strict sur les erreurs du code. Selon developer.mozilla.org,
  1. Le mode strict élimine quelques erreurs silencieuses de JavaScript en les changeant en erreurs explicites (une exception sera levée).
  2. Le mode strict corrige les erreurs qui font qu'autrement il est difficile pour les moteurs JavaScript d'effectuer des optimisations. Le code sera donc exécuté plus rapidement en mode strict, sans changer une seule ligne si cela n'est pas nécessaire.
  3. Le mode strict interdit les mot-clés susceptibles d'être définis dans les futures versions de ECMAScript.
Pour indiquer au navigateur l'utilisation de ce mode, il suffit d'ajouter "use strict"; au début du code source. Les navigateurs antérieurs la prendront comme une expression littérale et l'ignoreront.

Variable non déclarée
"use strict";
x = 3.14;   // cause une erreur car x n'est pas déclaré
Objet non déclaré
"use strict";
x = {p1:10, p2:20};      // cause une erreur: objet non déclaré
Redéclaration
En mode strict, on peut redéclarer une variable. Cependant redéclarer un let dans un bloc produira une erreur de syntaxe.
<script>
'use strict';
var a = 'foo';
var a = 'bar'; // No problem, a est remplacé.

'use strict';
let a = 'foo';
let a = 'bar'; // SyntaxError: Identifier 'a' has already been declared
</script>
Supprimer une fonction
"use strict";
function x(p1, p2) {}; 
delete x;                // cause une erreur 
Dupliquer un paramètre
"use strict";
function x(p1, p2) {}; 
delete x;                // cause une erreur
Littéral numérique octal interdit:
"use strict";
var x = 010;             // Saint Tax Error
Caractères spéciaux octal interdits:
"use strict";
var x = "\010";            // Saint Tax Error
Ecrire une propriété en lecture seule interdit:
"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;            // cause une erreur
Ecrire une propriété get-only:
"use strict";
var obj = {get x() {return 0} };

obj.x = 3.14;            // cause une erreur
Supprimer une propriété non supprimable interdit:
"use strict";
delete Object.prototype; // cause une erreur
eval ne peut pas être employé comme nom de variable:
"use strict";
var eval = 3.14;         // cause une erreur
eval() ne crée pas de variable dans sa portée:
"use strict";
eval ("var x = 2");
alert (x);             // cause une erreur
Le statement with est interdit:
"use strict";
with (Math){x = cos(2)}; // cause une erreur
Dans un appel de fonction, le mot clé this fait référence à l'objet global. En mode strict, this vaut undefined. "Cela signifie entre autres qu'il est impossible de faire référence à l'objet window du navigateur grâce à this au sein d'une fonction en mode strict." :
"use strict";
function fun() { return this; }
console.log(fun() === undefined); // true
console.log(fun.call(2) === 2); // true
console.log(fun.apply(null) === null); // true
console.log(fun.call(undefined) === undefined); // true
console.log(fun.bind(true)() === true); // true
Mots réservés de la syntaxe, interdits comme nom de variable:
implements
interface
let
package
private
protected
public
static
yield
"use strict";
var public = 1500;      // cause une erreur


Le mode strict s'applique à des scripts entiers ou à des fonctions individuelles:
x = 3.14;       // ne cause pas d'erreur
maFonction();

function maFonction() {
  "use strict";
  y = 3.14;   // cause une erreur
}

function strict() {
  // Syntaxe en mode strict au niveau de la fonction
  'use strict';
  function nested() { return "Ho que oui, je le suis !"; }
  return "Allô ! Je suis une fonction en mode strict ! " + nested();
}
function notStrict() { return "Je ne suis pas strict."; }

Références

www.w3schools.com
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Strict_mode
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Strict_mode/Passer_au_mode_strict