Maison >interface Web >Questions et réponses frontales >Quelles sont les différences entre le mode strict javascript

Quelles sont les différences entre le mode strict javascript

青灯夜游
青灯夜游original
2022-02-18 18:18:292135parcourir

Différences : 1. L'utilisation de l'instruction with est interdite ; 2. Il est interdit au mot-clé this de pointer vers l'objet global ; 3. Il est interdit de parcourir la pile d'appels à l'intérieur de la fonction ; le même nom, et les fonctions ne peuvent pas avoir de paramètres portant le même nom ; 5. La notation octale est interdite ; 6. L'attribution d'arguments n'est pas autorisée 7. Les fonctions ne peuvent pas être déclarées dans des blocs de code non fonctionnels ;

Quelles sont les différences entre le mode strict javascript

L'environnement d'exploitation de ce tutoriel : système Windows 7, JavaScript version 1.8.5, ordinateur Dell G3.

Différences en mode strict JavaScript

Le mode strict a apporté quelques modifications à la syntaxe et au comportement de Javascript.

1 Déclaration explicite de variables globales

En mode normal, si une variable reçoit une valeur sans être déclarée, elle est par défaut une variable globale. Le mode strict interdit cette utilisation et les variables globales doivent être déclarées explicitement.

"use strict";
  v = 1; // 报错,v未声明
  for(i = 0; i < 2; i++) { // 报错,i未声明
  }

Par conséquent, en mode strict, les variables doivent être déclarées avec la commande var avant utilisation.

2 Liaison statique

Une caractéristique du langage Javascript est qu'il permet une "liaison dynamique", c'est-à-dire que l'objet auquel appartiennent certaines propriétés et méthodes n'est pas déterminé au moment de la compilation, mais au moment de l'exécution (runtime) déterminé.

Le mode strict impose certaines restrictions sur la liaison dynamique. Dans certains cas, seule la liaison statique est autorisée. En d’autres termes, l’objet auquel appartiennent les propriétés et les méthodes est déterminé lors de la phase de compilation. Cela contribuera à améliorer l’efficacité de la compilation, à rendre le code plus facile à lire et à provoquer moins de surprises.

Plus précisément, cela implique les aspects suivants.

(1) Il est interdit d'utiliser l'instruction with

car l'instruction with ne peut pas déterminer au moment de la compilation à quel objet appartient l'attribut.

  "use strict";
  var v  = 1;
  with (o){ // 语法错误
    v = 2;
  }

(2) Créer une portée d'évaluation

En mode normal, le langage Javascript a deux portées variables : la portée globale et la portée de la fonction. Le mode strict crée une troisième portée : la portée d'évaluation.

En mode normal, la portée de l'instruction eval dépend si elle se trouve dans la portée globale ou dans la portée de la fonction. En mode strict, l'instruction eval elle-même est une portée et ne peut plus générer de variables globales. Les variables qu'elle génère ne peuvent être utilisées que dans eval.

  "use strict";
  var x = 2;
  console.info(eval("var x = 5; x")); // 5
  console.info(x); // 2

3 Mesures de sécurité renforcées

(1) interdisent à ce mot-clé de pointer vers l'objet global

  function f(){
    return !this;
  }
  // 返回false,因为"this"指向全局对象,"!this"就是false
  function f(){  
    "use strict";
    return !this;
  }
  // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。

Par conséquent, lors de l'utilisation du constructeur, si vous oubliez d'ajouter new, cela ne pointera plus vers l'objet global, mais c'est une erreur.

  function f(){
    "use strict";
    this.a = 1;
  };
  f();// 报错,this未定义

(2) Il est interdit de parcourir la pile d'appels à l'intérieur de la fonction

  function f1(){
    "use strict";
    f1.caller;    // 报错
    f1.arguments; // 报错
  }
  f1();

4 Il est interdit de supprimer des variables

Les variables ne peuvent pas être supprimées en mode strict. Seules les propriétés d'objet dont configurable est défini sur true peuvent être supprimées.

  "use strict";
  var x;
  delete x; // 语法错误
  var o = Object.create(null, {&#39;x&#39;: {
      value: 1,
      configurable: true
  }});
  delete o.x; // 删除成功

5 Rapport d'erreur explicite

En mode normal, l'attribution d'une valeur à une propriété en lecture seule d'un objet ne signalera pas d'erreur, mais échouera silencieusement. En mode strict, une erreur sera signalée.

  "use strict";

  var o = {};
  Object.defineProperty(o, "v", { value: 1, writable: false });
  o.v = 2; // 报错

En mode strict, une erreur sera signalée lors de l'attribution d'une valeur à une propriété lue à l'aide de la méthode getter.

  "use strict";

  var o = {
   
    get v() { return 1; }
  };
  o.v = 2; // 报错

En mode strict, l'ajout de nouveaux attributs aux objets dont l'expansion est interdite entraînera une erreur.

  "use strict";
  var o = {};
  Object.preventExtensions(o);
  o.v = 1; // 报错

En mode strict, si vous supprimez un attribut qui ne peut pas être supprimé, une erreur sera signalée.

  "use strict";
  delete Object.prototype; // 报错

6 Erreur de nom en double

Le mode strict a ajouté de nouvelles erreurs de syntaxe.

(1) Les objets ne peuvent pas avoir d'attributs avec des noms en double

En mode normal, si un objet a plusieurs attributs avec des noms en double, le dernier attribut attribué écrasera la valeur précédente. En mode strict, il s'agit d'une erreur de syntaxe.

  "use strict";
  var o = {
    p: 1,
    p: 2
  }; // 语法错误

(2) La fonction ne peut pas avoir de paramètres du même nom

En mode normal, si la fonction a plusieurs paramètres du même nom, vous pouvez utiliser des arguments[i] pour les lire. En mode strict, il s'agit d'une erreur de syntaxe.

  "use strict";
  function f(a, a, b) { // 语法错误
    return ;
  }

7 Représentation octale interdite

En mode normal, si le premier chiffre d'un entier est 0, cela signifie qu'il s'agit d'un nombre octal, par exemple, 0100 est égal à 64 en décimal. Le mode strict interdit cette représentation, le premier bit de l'entier est 0, et une erreur sera signalée.

  "use strict";
  var n = 0100; // 语法错误

8 Limitations de l'objet arguments

arguments est l'objet paramètre de la fonction, et le mode strict restreint son utilisation.

(1) L'affectation aux arguments n'est pas autorisée

  "use strict";
  arguments++; // 语法错误
  var obj = { set p(arguments) { } };  // 语法错误
  try { } catch (arguments) { }  // 语法错误
  function arguments() { }  // 语法错误
  var f = new Function("arguments", "&#39;use strict&#39;; return 17;");  // 语法错误

(2) les arguments ne suivent plus les modifications des paramètres

  function f(a) {
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 正常模式为[2,2]
  function f(a) {
    "use strict";
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 严格模式为[2,1]

(3) L'utilisation d'arguments.callee est interdite

Cela signifie que vous ne pouvez pas être anonyme La fonction s'appelle elle-même en interne.

  "use strict";
  var f = function() { return arguments.callee; };
  f(); // 报错

9 Les fonctions doivent être déclarées au niveau supérieur

À l'avenir, les nouvelles versions de Javascript introduiront une "portée au niveau du bloc". Afin de rester conforme à la nouvelle version, le mode strict permet uniquement de déclarer les fonctions dans la portée globale ou le niveau supérieur de la portée de la fonction. Autrement dit, il n'est pas autorisé de déclarer des fonctions dans un bloc de code non fonctionnel.

  "use strict";
  if (true) {
    function f() { } // 语法错误
  }
  for (var i = 0; i < 5; i++) {
    function f2() { } // 语法错误
  }

【相关推荐:javascript学习教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn