Gasper đã viết nhận xét với các giải pháp ông kết thúc, nhưng tôi nghĩ rằng nó đáng để gọi ra như một câu trả lời thực tế:
try
{
delete window.x;
}
catch(e)
{
window["x"] = undefined;
}
Thú vị vấn đề , Tôi vừa đập đầu vào tối nay. Ngoại lệ được ném trên IE nhưng không phải là Firefox. Tôi sẽ nghi ngờ cách này giải phóng bộ nhớ, vì vậy hãy sử dụng một cách tiết kiệm.
Đã hỏi, tại sao không chỉ định không xác định? Nó quan trọng nếu bạn muốn liệt kê các khóa sau này (mặc dù nếu bạn đang dựa vào cách giải quyết, việc liệt kê chính vẫn sẽ không làm những gì bạn muốn ...). Nhưng dù sao đi nữa, để làm nổi bật sự khác biệt giữa xóa và chỉ cần gán không xác định (http://jsfiddle.net/fschwiet/T4akL/):
var deleted = {
a: 1
};
var cleared = {
a: 1
};
delete deleted["a"];
cleared["a"] = undefined;
for(var key in deleted) {
console.log("deleted has key", key);
}
for(var key in cleared) {
console.log("cleared has key", key);
}
console.log("deleted has a?", deleted.hasOwnProperty('a'));
console.log("cleared has a?", cleared.hasOwnProperty('a'));
sản xuất đầu ra:
cleared has key a
deleted has a? false
cleared has a? true
Nguồn
2009-12-01 05:47:58
Và chỉ để rõ ràng, bởi vì nó không giống như bất cứ ai thực sự nói điều này trong bất kỳ câu trả lời: Đây là một * lỗi * trong Internet Explorer. Không có gì trong đặc tả năm 1999 (phiên bản thứ 3) cho phép ném một ngoại lệ từ 'delete', ngay cả khi thuộc tính không tồn tại hoặc không thể truy xuất được (trong đó' window.x' của bạn sẽ không nằm trong bất kỳ trường hợp nào), và Thông số phiên bản 5 mới chỉ cho phép ngoại lệ được ném từ 'xóa' ở chế độ nghiêm ngặt mới. Không có gì đặc biệt về 'cửa sổ' trong vấn đề này. Chưa hết, công cụ JScript trong IE8 * vẫn * thể hiện lỗi này, vào năm 2010. * thở dài * –
[Bài viết liên quan tốt] (http://perfectionkills.com/understanding-delete/). – alex
T.J. Crowder, cửa sổ không phải là một đối tượng, nó là một accessor đến không gian tên gốc. Nó không có thuộc tính như vậy, vì vậy khi bạn chạy xóa trên nó, chẳng hạn như trong trường hợp này, nó không có nghĩa vụ phải thực sự loại bỏ chúng vì bất kỳ lý do gì. Thiết lập không xác định trên tên của đối tượng là tốt để làm bởi vì gc sẽ đi qua và loại bỏ các đối tượng unreferenced. Hy vọng điều này sẽ giúp hiểu vấn đề thực tế ở đây và tại sao điều này không phải là một lỗi vì nó là một sự lựa chọn thực hiện nghèo cho ngôn ngữ đang dần cập nhật để hiện đại hóa –