From the Mozilla JS Docs for delete
:
delete
chỉ có hiệu quả trên các thuộc tính của một đối tượng. Nó không có hiệu lực về tên biến hoặc hàm.
Ví dụ được cung cấp tương tự như của bạn.
x = 42; // creates the property x on the global object
var y = 43; // declares a new variable, y
delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)
Vì vậy, tại sao alert(delete y);
hoạt động? Tôi không thể giải đáp được câu trả lời chính xác, nhưng về cơ bản bạn không thể dựa vào phạm vi của eval.
Tôi nghĩ eval('var y = 2');
không được khai báo là biến và được coi là tài sản, nhưng tôi chưa tìm thấy bằng chứng cho điều đó ngoài kết quả của các bài kiểm tra của chúng tôi. Tôi sẽ tiếp tục nghiên cứu để xem tôi có tìm được lý do chính xác hay không.
bài viết khác về eval
weirdness:
EDIT 0
Dựa trên nhận xét của @Xavier Holt, tôi đã tìm kiếm cẩu và phạm vi liên quan đến eval
. This scope cheatsheet from Mozilla Dev docs thăm như sau:
eval có thể nắm bắt bài tập, nhưng không var tờ khai
vars eval'd Palăng thường, vì vậy evals có thể nắm bắt công việc tương tự đến với:
function f() { {
let x = "inner";
eval("var x = 'outer'");
print(x); // "outer" }
}
Nếu tôi đọc chính xác, thì giả định trước đó của tôi là đúng. eval()
không đánh giá var
khai báo bằng cách khai báo biến. Nó phải tạo một tài sản hoặc được coi là tài sản để delete
hoạt động.
Câu hỏi về tiền thưởng: tại sao bạn lại cần điều này? –
Tôi không thể cung cấp cho bạn bất kỳ chi tiết kỹ thuật nào, nhưng tôi nghi ngờ điều này liên quan đến hành vi "[hoisting] (http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting)" của JavaScript. Về cơ bản, các biến được định nghĩa với 'var foo;' nhận được sự xử lý đặc biệt, vì công cụ JS biết chúng có ở đó trước khi hàm chạy.Các biến được khai báo với 'eval' không được nhận dạng, và do đó không nhận được điều trị đặc biệt đó. –
Bạn đã đọc http://perfectionkills.com/understanding-delete/? – Bergi