2010-04-22 28 views
8

Vòng đời của biến trong JavaScript, được khai báo bằng "var". Tôi chắc chắn, nó chắc chắn không theo mong đợi.Tuổi thọ của các biến JavaScript

<script> 
function(){ 
    var a; 
    var fun=function(){ 
    // a is accessed and modified 
    } 
}(); 


</script> 

Đây là cách thức và thời điểm JavaScript thu thập biến số a? Vì a là một phần của việc đóng chức năng bên trong, nên lý tưởng không bao giờ nên thu gom rác, vì hàm bên trong fun, có thể được chuyển như một tham chiếu đến một ngữ cảnh bên ngoài. Vì vậy, fun vẫn có thể truy cập a từ ngữ cảnh bên ngoài.

Nếu hiểu biết của tôi là chính xác, thì việc thu gom rác sẽ xảy ra như thế nào và đảm bảo có đủ dung lượng bộ nhớ như thế nào, vì giữ tất cả các biến trong bộ nhớ cho đến khi thực thi chương trình có thể không được?

+0

Đây là một câu hỏi tuyệt vời btw. Nó chỉ ra rằng đóng cửa chính nó không phải là điều duy nhất được tổ chức trong bộ nhớ cho đến khi đóng cửa là GC'ed. Toàn bộ chuỗi phạm vi của hàm cũng vậy. Dường như có một số tranh cãi, nhưng một số suy nghĩ bổ sung dường như chỉ ra rằng mọi khai báo hàm trong JavaScript là một sự đóng, liên quan đến phạm vi toàn cầu. Tuy nhiên có một ngoại lệ [xem câu trả lời này] (http://stackoverflow.com/a/30252865/511795) – Shanimal

Trả lời

4

Đặc tả ECMAScript không chỉ rõ cách trình thu gom rác hoạt động, nó chỉ nói rằng nếu một số nhận dạng có thể truy cập được (thông qua một con trỏ trực tiếp hoặc một đóng), thì nó không được GC.

Khám phá this bài viết về giải pháp nhận dạng, đóng cửa, phạm vi chuỗi và thu thập rác trong ECMAScript.

Hy vọng điều này sẽ giúp

1

'a' sẽ không được thu thập rác miễn là có tham chiếu bên ngoài 'vui'. Trình duyệt đảm bảo nó có đủ bộ nhớ bằng cách yêu cầu thêm bộ nhớ từ hệ điều hành.

+0

"Trình duyệt đảm bảo nó có đủ bộ nhớ bằng cách yêu cầu thêm bộ nhớ từ hệ điều hành." - lol ... đủ công bằng :-) – osa

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