web-dev-qa-db-fra.com

Effet des variables déclarées et non déclarées

Quelle est la principale différence entre les variables déclarées par JavaScript et les variables non déclarées, puisque L'opérateur de suppression ne fonctionne pas avec les variables déclarées?

 var y = 43;     // declares a new variable
 x = 42;

 delete x;       // returns true  (x is a property of the global object and can be deleted)
 delete y;       // returns false (delete doesn't affect variable names) 

Pourquoi cela arrive-t-il? Les variables déclarées globalement sont également les propriétés de l'objet window, alors pourquoi ne peut-il pas être supprimé?

26

Variables globales déclarées et non déclarées

Le mécanisme pour les stocker et y accéder est le même, mais JavaScript les traite différemment dans certains cas en fonction de la valeur de l'attribut configurabledécrit ci-dessous). En utilisation régulière, ils devraient se comporter de la même manière.

Les deux existent dans l'objet global

Vous trouverez ci-dessous des comparaisons de variables _ (déclaréeset non déclaréesglobales.

var declared = 1;  // Explicit global variable (new variable)
undeclared   = 1;  // Implicit global variable (property of default global object)

window.hasOwnProperty('declared')    // true
window.hasOwnProperty('undeclared')  // true

window.propertyIsEnumerable('declared')    // true
window.propertyIsEnumerable('undeclared')  // true

window.declared     // 1
window.undeclared   // 1

window.declared   = 2;
window.undeclared = 2;

declared     // 2
undeclared   // 2

delete declared     // false
delete undeclared   // true
delete undeclared   // true (same result if delete it again)

delete window.declared     // false
delete window.undeclared   // true (same result if delete it yet again)
delete window.undeclared   // true (still true)

Les deux variables déclaréeset undeclaredglobal) sont des propriétés de l'objet windowl'objet global par défaut). Aucune des deux n'est héritée d'un autre objet via la chaîne de prototypes. Elles existent toutes deux directement dans l'objet window (depuis window.hasOwnProperty retourne true pour les deux).

L'attribut configurable

Pour _ (déclarévariables globales, l'attribut configurable est false. Pour non déclarévariables globales, il s'agit de true. La valeur de l'attribut configurable peut être extraite à l'aide de la méthode getOwnPropertyDescriptor , comme indiqué ci-dessous.

var declared = 1;
undeclared = 1;

(Object.getOwnPropertyDescriptor(window, 'declared')).configurable     // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable   // true

Si l'attribut configurable d'une propriété est true, vous pouvez modifier ses attributs à l'aide de la méthode defineProperty et supprimer la propriété à l'aide de l'opérateur delete . Sinon, les attributs ne peuvent pas être modifiés et la propriété ne peut pas être supprimée de cette manière.

Dans mode non strict , l'opérateur delete renvoie true si la propriété est configurable et false si elle n'est pas configurable.

Résumé

Variable globale déclarée

  • Est une propriété de l'objet global par défaut (window)
  • Les attributs de la propriété ne peut pasêtre modifié).
  • Impossibleêtre supprimé à l'aide de l'opérateur delete

Variable globale non déclarée

  • Est une propriété de l'objet global par défaut (window)
  • Les attributs de propriété canpeuvent être modifiés.
  • Peutêtre supprimé à l'aide de l'opérateur delete

Voir également

24
Matt Coughlin

La principale différence est lorsque vous déclarez des variables dans une fonction. Si vous utilisez var lorsque vous déclarez une variable dans une fonction, cette variable devient une variable locale. Toutefois, si vous n'utilisez pas var, la variable devient une variable globale, où que vous le déclariez (à l'intérieur ou à l'extérieur d'une fonction).

1
Pat

Lorsqu'une variable est créée via Déclaration de variable dans JavaScript , ces propriétés sont créées avec l'attribut " DontDelete ", ce qui signifie que cette variable ne peut pas être supprimée à l'aide de l'expression "delete". Toutes les fonctions, arguments et paramètres de fonction par défaut sont créés avec cet attribut DontDelete. Vous pouvez considérer DontDelete comme un drapeau. 

var y = 43;
delete y;         //returns false because it is has a DontDelete attribute

Tandis que l'affectation non déclarée ne définit aucun attribut tel que DontDelete . Ainsi, lorsque nous appliquons delete operator sur cette variable non déclarée, elle renvoie true.

x = 42;
delete x;        //returns true because it doesn't have a DontDelete attribute

La différence entre l’attribution de propriété et la déclaration de variable - la dernière définit DontDelete, alors que la première ne le fait pas. C'est pourquoi l'affectation non déclarée crée une propriété pouvant être supprimée.

Lien sur le fonctionnement exact de l'opérateur de suppression

1
Sasank Sunkavalli

la suppression n'est effective que sur les propriétés d'un objet. Cela n'a aucun effet sur les noms de variables ou de fonctions.

Dans votre cas, x = 42; déclare la variable X et en fait la propriété de l'objet Global. Donc, cela retourne vrai. 

Et var y = 43; déclare une variable globale qui ne fait partie d'aucun objet et renvoie donc false. 

0
Jay Bhatt