2012-03-16 25 views
7

Tôi nhận được lỗi này với JSLint: Chỉ tính nên bị xóaChỉ tính nên bị xóa

Tại sao không nó như thế này? Biến tôi đang cố gắng xóa là rất lớn, vì vậy tôi đã hy vọng để có được một bước nhảy vào bộ sưu tập rác. Điều này có ổn không?

+3

Bạn không thể xóa biến, chỉ thuộc tính đối tượng. Vì vậy, ngay cả khi 'var a = 5; xóa một; 'không ném một lỗi (nó thực sự trong * chế độ nghiêm ngặt *), nó không làm bất cứ điều gì hoặc là (' xóa a; 'sẽ trả về' false'). Vì vậy: Đó là mã hợp lệ, nhưng nó không làm những gì bạn muốn, vì vậy nó chỉ là khó hiểu. –

+0

@ FelixKling Không, đó không phải là sự thật. Trên thực tế bạn có thể xóa các biến bằng toán tử delete. Bạn có thể viết và chạy mã thử nghiệm. 'var a = 11; cảnh báo (xóa a); alert (typeof a); ' sẽ cảnh báo đúng và" không xác định ". – cuixiping

+3

@cuixiping Felix Kling là đúng. Bạn không thể xóa các biến (cục bộ) bằng cách sử dụng 'delete'. Các biến toàn cục là khác nhau vì chúng thực sự là các thuộc tính gắn liền với đối tượng 'window'. – NullUserException

Trả lời

11

delete có nghĩa là xóa thuộc tính trên đối tượng chứ không phải biến thông thường (thuộc tính trên Biến thể).

Thay vào đó, bạn có thể đặt tất cả các tham chiếu đến giá trị là null. GC của JavaScript sẽ làm sạch nó khi nó cảm thấy cần.

2

nếu bạn chỉ muốn thoát khỏi cảnh báo JSLint, bạn có thể thử này:

var myHugeVariable = ...; 

// do stuff with huge variable 

delete window.myHugeVariable; 

này nên làm việc kể từ khi tất cả các biến toàn cầu thực sự là tài sản của đối tượng toàn cầu.

+0

Còn các biến cục bộ thì sao? ;) –

+0

@FelixKling câu hỏi hay. tôi chắc chắn rằng 70% tất cả các biến được khai báo ở bất cứ nơi nào phải là tài sản của một số đối tượng, nó chỉ là vấn đề tìm ra đối tượng mà chúng tồn tại. – jbabey

+0

@jbabey Các biến thông thường là các thuộc tính của một VariableObject của ngữ cảnh thực thi, không có giao diện công khai trong API JavaScript. Theo như bộ nhớ của tôi về spec đi, ít nhất: P – alex

1

Thông thường, không cần thiết phải giải phóng biến. Động cơ javascript thực hiện điều đó một cách tự động.

Hoặc, bạn có thể để biến bằng với số chưa xác định, vì vậy bạn có thể vượt qua kiểm tra.

var a=11; 
a = undefined; 

Không được khuyến nghị.

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