2013-07-03 18 views
6

Execute mã dưới đây trong bối cảnh toàn cầu:lý do javascript phân biệt bài tập có hoặc không có khai báo khi xóa?

var x = 1; 
y = 1 
delete x //false 
delete y //true 

Cả xy là tài sản của đối tượng toàn cầu. Tại sao javascript phải phân biệt chúng ở một mức độ nào đó?


Dễ dàng tuân theo quy trình thường xuyên theo tiêu chuẩn ES5 the delete operatorthe object internal method[[delete]].

Câu hỏi rõ ràng hơn được thể hiện là lý do tại sao thuộc tính khác nhau [[configurable]] họ chấp nhận?

+0

@FelixKling Xin chào, hẹn gặp lại! Nhưng tôi không hiểu tại sao họ có thuộc tính '[[cấu hình]] khác nhau. Bạn biết tôi đọc các tiêu chuẩn nhưng không tìm thấy bất kỳ bằng chứng cho điều đó. Quyết định như vậy được thúc đẩy bởi? – yuan

+0

Tôi không thể nói với bạn rằng, tôi đã không đưa ra quyết định đó :) Có lẽ bạn nên liên hệ với một người làm việc theo tiêu chuẩn ECMAScript. –

Trả lời

5

Nhìn vào câu trả lời thứ hai trong this related question bởi kangax.

var x = 1 tuyên bố biến x trong phạm vi hiện tại (còn gọi là thực thi ngữ cảnh). Nếu khai báo xuất hiện trong một hàm - biến cục bộ là được khai báo; nếu nó trong phạm vi toàn cục - biến toàn cầu được khai báo. Mặt khác,

x = 1 chỉ đơn thuần là một phân bổ thuộc tính. Đầu tiên, cố gắng giải quyết x đối với chuỗi phạm vi. Nếu nó tìm thấy nó ở bất kỳ đâu trong chuỗi phạm vi đó, nó thực hiện nhiệm vụ; nếu nó không tìm thấy x, chỉ có thì nó sẽ tạo ra x thuộc tính trên một đối tượng toàn cầu (là đối tượng cấp cao nhất ở mức trong một chuỗi phạm vi).

Bây giờ, lưu ý rằng nó không khai báo biến toàn cầu, nó tạo ra một thuộc tính toàn cầu .

Sự khác biệt giữa hai là tinh tế và có thể gây nhầm lẫn, trừ khi bạn hiểu rằng khai báo biến cũng tạo tài sản (chỉ trên một Object Variable) và rằng tất cả các tài sản trong Javascript (tốt, ECMAScript) có một số cờ mô tả của họ các thuộc tính - ReadOnly, DontEnum và DontDelete.

Kể từ khi khai báo biến tạo ra tài sản với DontDelete cờ, sự khác biệt giữa var x = 1 và x = 1 (khi thực hiện trong phạm vi toàn cầu) là cựu một - biến khai - tạo DontDelete'able bất động sản, và sau không. Kết quả là, thuộc tính được tạo ra thông qua chuyển nhượng tiềm ẩn này sau đó có thể bị xóa khỏi đối tượng toàn cầu và đối tượng cũ được tạo thông qua khai báo biến - không thể.

+0

Đây cũng là loại tài liệu ở đây https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete – elclanrs

Các vấn đề liên quan