Sono abbastanza nuovo per javascript, ma sono innamorato di esso è espressività pericolosamente veloce e sciolto. Detto questo, ho notato che apparentemente quando si opera in modalità "use strict", non è possibile cancellare oggetti. Non sono un grande fan dell'eliminazione di cose (dal momento che, in teoria, lo scopo dovrebbe occuparsene comunque), ma mi chiedo quale sia stata la motivazione alla base della rimozione di questa funzionalità?Perché l'eliminazione non è consentita in modalità rigorosa Javascript?
risposta
L'istruzione delete
è ancora consentita in modalità rigorosa, ma alcuni usi particolari di esso sono errati. È consentito solo per le proprietà dell'oggetto, non per i nomi semplici e solo per le proprietà dell'oggetto che possono essere eliminate.
Così
var a = {x: 0};
delete a.x;
è soddisfacente, ma
delete Object.prototype;
non è, e nessuno dei due è
delete a;
(Quest'ultimo è in realtà un errore a livello di sintassi, mentre un tentativo eliminare una proprietà non cancellabile è un errore di runtime.)
Interessante. Quindi, perché proibire di essere in grado di eliminare la stessa var vera? – sircodesalot
@sircodesalot perché è piuttosto strano far sì che una variabile locale vada via. Rende la semantica di un blocco di codice molto più difficile da descrivere. (In realtà non sono sicuro di aver visto una motivazione "ufficiale".) – Pointy
@sircodesalot: le associazioni di variabili non possono cambiare all'interno di un ambito. Se un ambito contiene 'var foo', tutti i riferimenti a' foo' all'interno di tale ambito faranno riferimento a una variabile creata per quell'ambito. Altrimenti si riferiranno a una variabile 'pippo' in un ambito esterno, se ne esiste uno. Poiché le variabili non sono create da istruzioni eseguibili, né possono essere distrutte da esse. – supercat
[eliminare] spiegata in dettaglio con l'esempio
// The delete statement is still allowed in strict mode, but some particular uses of it are erroneous. It's only allowed for object properties, not simple names, and only for object properties that can be deleted.
// "use strict";
// creates the property adminName on the global scope
adminName = "xyz";
// creates the property empCount on the global scope
// Since we are using var, this is marked as non-configurable. The same is true of let and const.
var empCount = 43;
EmployeeDetails = {
name: "xyz",
age: 5,
designation: "Developer"
};
// adminName is a property of the global scope.
// It can be deleted since it is created without var.
// Therefore, it is configurable.
console.log("delete adminName =", delete adminName); // returns true
// On the contrary, empCount is not configurable,
// since var was used.
console.log("delete empCount =", delete empCount); // returns false
// delete can be used to remove properties from objects
console.log("delete EmployeeDetails.name =", delete EmployeeDetails.name); // returns true
// Even when the property does not exists, it returns "true"
console.log("delete EmployeeDetails.salary =", delete EmployeeDetails.salary); // returns true
// delete does not affect built-in static properties
console.log("delete Math.PI =", delete Math.PI); // returns false
// EmployeeDetails is a property of the global scope.
// Since it defined without "var", it is marked configurable
console.log("delete EmployeeDetails =", delete EmployeeDetails); // returns true
x = 1;
var y = 2;
function f() {
var z = 44;
console.log("delete x =", delete x); // returns true
console.log("delete y =", delete y); // returns false
// delete doesn't affect local variable names
console.log("delete z =", delete z); // returns false
}
f.call();
- 1. Modalità rigorosa in un namespace con Javascript
- 2. Variabili globali in modalità rigorosa JavaScript
- 3. violazioni modalità rigorosa
- 4. Modalità rigorosa: alternativa a argument.callee.length?
- 5. Perché l'autenticazione della password non è consentita?
- 6. Forza la modalità sql rigorosa in django
- 7. C'è un motivo per non utilizzare la modalità Rigorosa in JavaScript?
- 8. UI-Grid: Errore "definizioni multiple di una proprietà non consentita in modalità rigorosa [object Object]" [IE- Solo]
- 9. I letterali ottali non sono consentiti in modalità rigorosa
- 10. Qual è il vantaggio della modalità DI rigorosa AngularJS?
- 11. Come ottenere il chiamante dalla modalità rigorosa?
- 12. Che convalida fa MySQL fare quando modalità rigorosa è abilitata?
- 13. Impostare la modalità rigorosa in PowerShell per tutti i moduli
- 14. Perché una virgola extra non è consentita in un elenco di parametri quando è consentita in un'inizializzazione di controvento?
- 15. Perché la covarianza non è consentita con ReadOnlyCollection?
- 16. La trasmissione a vuoto (non il puntatore) è consentita, perché?
- 17. Quali funzionalità di ECMAScript 6 implicano una modalità rigorosa?
- 18. cos'è la "modalità rigorosa" e come viene utilizzata?
- 19. Come disattivare la modalità rigorosa mentre bundling Reagire utilizzando webpack
- 20. Ottieni il nome della funzione corrente in modalità rigorosa
- 21. Perché l'inizializzazione dei riferimenti a null è consentita in Java?
- 22. come risolvere angolare non usare l'annotazione esplicita e non può essere invocata in modalità rigorosa
- 23. Perché non tutto è assegnabile in JavaScript?
- 24. Perché eval non è sicuro in javascript?
- 25. Un modo per forzare la modalità rigorosa nel nodo?
- 26. PHPUnità della modalità rigorosa - come modificare il timeout predefinito
- 27. L'azione richiesta non è consentita. Codigniter
- 28. mmap: Operazione non consentita
- 29. modalità rigorosa per evitare la conversione del tipo
- 30. Babel/Karma/Chai restituisce TypeError: non è possibile accedere alle proprietà 'caller', 'callee' e 'arguments' su funzioni in modalità rigorosa
E 'anche ben spiegato in: [modalità Strict MDN] (https://developer.mozilla.org/en- US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode) "* Conversione di errori in errori *" –