2012-12-13 41 views
5

Nếu tôi chạy đoạn mã sau vào google chrome console tôi nhận được kết quả như sauvề cấu trúc câu eval và xóa

var x = 1; 

alert(delete x); // false 

eval('var y = 2'); 

alert(delete y); // true 

Tại sao trong ví dụ đầu tiên biến được không bị xóa và trong ví dụ thứ hai nó bị xóa?

+6

Câu hỏi về tiền thưởng: tại sao bạn lại cần điều này? –

+1

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 đó. –

+0

Bạn đã đọc http://perfectionkills.com/understanding-delete/? – Bergi

Trả lời

1

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ác vấn đề liên quan