Effetto delle variabili dichiarate e non dichiarate

Qual è la principale differenza tra le variabili dichiarate e non dichiarate da JavaScript, poiché l’operatore delete non funziona sulle variabili dichiarate?

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) 

Perché succede? Le variabili dichiarate globalmente sono anche le proprietà dell’object window, quindi perché non può essere cancellato?

Variabili globali dichiarate e non dichiarate

Il meccanismo per archiviarli e accedervi è lo stesso, ma JavaScript li tratta in modo diverso in alcuni casi in base al valore dell’attributo configurable (descritto di seguito). Nell’uso regolare, dovrebbero comportarsi allo stesso modo.

Entrambi esistono nell’object globale

Di seguito sono riportati alcuni confronti tra le variabili globali dichiarate e non dichiarate .

 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) 

Sia le variabili globali dichiarate che non dichiarate sono proprietà dell’object window (l’object globale predefinito). Nessuno dei due viene ereditato da un object diverso attraverso la catena del prototipo. Entrambi esistono direttamente nell’object della window (poiché window.hasOwnProperty restituisce true per entrambi).

L’attributo configurabile

Per le variabili globali dichiarate , l’attributo configurable è false . Per le variabili globali non dichiarate , è true . Il valore dell’attributo configurable può essere recuperato utilizzando il metodo getOwnPropertyDescriptor , come mostrato di seguito.

 var declared = 1; undeclared = 1; (Object.getOwnPropertyDescriptor(window, 'declared')).configurable // false (Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable // true 

Se l’attributo configurable di una proprietà è true, gli attributi della proprietà possono essere modificati utilizzando il metodo defineProperty e la proprietà può essere eliminata utilizzando l’operatore delete . In caso contrario, gli attributi non possono essere modificati e la proprietà non può essere eliminata in questo modo.

In modalità non rigida , l’operatore delete restituisce true se la proprietà è configurabile e restituisce false se non è configurabile.

Sommario

Variabile globale dichiarata

  • È una proprietà dell’object globale predefinito ( window )
  • Gli attributi della proprietà non possono essere modificati.
  • Non può essere cancellato usando l’operatore di delete

Variabile globale non dichiarata

  • È una proprietà dell’object globale predefinito ( window )
  • Gli attributi della proprietà possono essere modificati.
  • Può essere cancellato usando l’operatore di delete

Guarda anche

  • cancella operatore
  • Object.defineProperty
  • Object.getOwnPropertyDescriptor
  • hasOwnProperty
  • Modalità rigorosa

La differenza principale è quando dichiari variabili all’interno di una funzione. Se si utilizza var quando si dichiara una variabile all’interno di una funzione, tale variabile diventa una variabile locale. Tuttavia, se non si utilizza var , la variabile diventa una variabile globale indipendentemente da dove viene dichiarata (all’interno o all’esterno di una funzione).

Quando una variabile viene creata tramite la dichiarazione delle variabili in JavaScript , queste proprietà vengono create con l’attributo ” DontDelete “, che in pratica significa che la variabile creata non può essere eliminata utilizzando l’espressione “elimina”. Tutte le funzioni, gli argomenti, i parametri di funzione per impostazione predefinita vengono creati con questo attributo DontDelete. Puoi pensare a DontDelete come a una bandiera.

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

Mentre l’assegnazione non dichiarata non imposta alcun attributo come DontDelete . Quindi, quando applichiamo l’operatore delete su questa variabile non dichiarata, restituisce true.

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

La differenza tra l’assegnazione della proprietà e la dichiarazione delle variabili: quest’ultima imposta DontDelete, mentre quella precedente non lo fa. Ecco perché l’incarico non dichiarato crea una proprietà cancellabile.

Link su come funziona esattamente l’operatore delete

l’eliminazione è efficace solo sulle proprietà di un object. Non ha alcun effetto sui nomi di variabili o funzioni.

Nel tuo caso x = 42; dichiara la variabile X e ne fa la proprietà dell’object Global. Quindi restituisce vero.

E var y = 43; dichiara una variabile globale che non fa parte di alcun object quindi restituisce false.