2013-05-20 26 views
36

Tôi khá mới với javascript, nhưng tôi rất thích biểu hiện nhanh và nguy hiểm. Điều đó nói rằng, tôi nhận thấy rằng dường như khi hoạt động trong chế độ "sử dụng nghiêm ngặt", bạn không thể xóa các đối tượng. Tôi không phải là một fan hâm mộ lớn của việc xóa những thứ (vì, về mặt lý thuyết, phạm vi nên chăm sóc đó anyway), nhưng tôi tự hỏi động lực đằng sau việc loại bỏ tính năng này là gì?Tại sao xóa không được cho phép trong chế độ nghiêm ngặt Javascript5?

+3

Nó cũng giải thích cũng tại địa chỉ: [chế độ nghiêm ngặt MDN] (https://developer.mozilla.org/en- US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode) "* Chuyển đổi lỗi thành lỗi *" –

Trả lời

59

Tuyên bố delete vẫn được cho phép ở chế độ nghiêm ngặt, nhưng một số cách sử dụng cụ thể của nó là sai. Nó chỉ được phép cho các thuộc tính đối tượng, không phải là các tên đơn giản và chỉ cho các thuộc tính đối tượng có thể bị xóa.

Như vậy

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

là tốt, nhưng

delete Object.prototype; 

không phải là, và cũng không phải là

delete a; 

(Sau đó thực sự là một lỗi cú pháp cấp, trong khi một nỗ lực để xóa thuộc tính không thể xóa được là lỗi thời gian chạy.)

+4

Thú vị. Vậy tại sao cấm tự xóa bản thân thực tế? – sircodesalot

+2

@sircodesalot vì nó khá kỳ lạ để tạo một biến cục bộ chỉ biến mất. Nó làm cho ngữ nghĩa của một khối mã khó mô tả hơn. (Tôi không thực sự chắc chắn rằng tôi đã nhìn thấy một lý do "chính thức".) – Pointy

+8

@ sircodesalot: Các ràng buộc biến không được phép thay đổi trong phạm vi. Nếu một phạm vi chứa 'var foo', thì tất cả các tham chiếu đến' foo' trong phạm vi đó sẽ tham chiếu đến một biến được tạo cho phạm vi đó. Nếu không, chúng sẽ tham chiếu đến một biến 'foo' trong phạm vi bên ngoài, nếu có tồn tại. Vì các biến không được tạo bởi các câu lệnh thi hành, chúng cũng không thể bị chúng phá hủy. – supercat

0

[xóa] Giải thích một cách chi tiết với ví dụ

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