2013-05-20 13 views
36

Jestem całkiem nowy w javascript, ale jestem zakochany w niebezpiecznie szybkiej i luźnej ekspresji. Mimo to zauważyłem, że podczas pracy w trybie "używaj ściśle" nie można usuwać obiektów. Nie jestem wielkim fanem usuwania rzeczy (ponieważ, teoretycznie, tak czy inaczej powinienem się tym zająć), ale zastanawiam się, jaka była motywacja usunięcia tej funkcji?Dlaczego usuwanie nie jest dozwolone w trybie ścisłym Javascript5?

+3

Jest również dobrze wyjaśnione na: [MDN trybie ścisłym] (https://developer.mozilla.org/en- US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode) "* Konwersja błędów na błędy *" –

Odpowiedz

59

Instrukcja delete jest nadal dozwolona w trybie ścisłym, ale niektóre jej szczególne zastosowania są błędne. Dopuszczalne są tylko właściwości obiektu, a nie proste nazwy i tylko właściwości obiektów, które można usunąć.

Zatem

var a = {x: 0}; 
delete a.x; 

jest w porządku, ale

delete Object.prototype; 

nie jest i nie jest

delete a; 

(Ten ostatni jest rzeczywiście błąd składni poziomie, podczas gdy próba aby usunąć właściwość undeletable, jest błąd środowiska wykonawczego.)

+4

Interesujące. Dlaczego więc nie można usunąć samego var? – sircodesalot

+2

@sircodesalot, ponieważ dziwne jest, że zmienna lokalna po prostu znika. Znacznie utrudnia opisanie semantyki bloku kodu. (Nie jestem pewien, czy widziałem "oficjalne" uzasadnienie.) – Pointy

+8

@sircodesalot: Powiązania zmiennych nie mogą się zmieniać w obrębie zakresu. Jeśli zakres zawiera 'var foo', wówczas wszystkie odniesienia do' foo' w tym zakresie będą odnosić się do zmiennej, która została utworzona dla tego zakresu. W przeciwnym razie będą odnosić się do zmiennej 'foo' w zewnętrznym zasięgu, jeśli taka istnieje. Ponieważ zmienne nie są tworzone przez wykonywalne instrukcje, ani nie mogą być przez nie zniszczone. – supercat

0

[usunięcia] opisanych szczegółowo w przykładzie

// 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();

Powiązane problemy