Không phải là "rò rỉ" chính xác, nhưng điều này có thể là một lỗ hổng phổ biến.
var fn = (function() {
var a = "super long string ...";
var b = "useless value";
var c = "Hello, World!";
return function() {
return c;
};
})();
này trả về một chức năng tham chiếu đến một phạm vi, và mỗi var địa phương duy nhất trong phạm vi đó sẽ được lưu giữ, mặc dù chỉ là một trong những giá trị đó là cần thiết. Điều này dẫn đến việc sử dụng bộ nhớ nhiều hơn mức bạn cần, đặc biệt nếu hàm của bạn sử dụng một biến nhỏ, nhưng có những giá trị lớn trong phạm vi đó mà bạn không cần phải tham khảo.
Cách khắc phục?
Tùy chọn đơn giản là loại bỏ các biến mà bạn không quan tâm ở phần cuối của hàm. Các biến vẫn nằm trong phạm vi, nhưng dữ liệu của chúng sẽ được giải phóng.
var fn = (function() {
var a = "super long string ...";
var b = "useless value";
var c = "Hello, World!";
// do stuff with a and b
a = b = null;
return function() {
return c;
};
})();
Hoặc bạn có thể phá vỡ bất kỳ thứ gì sử dụng temp nhiệt độ vào chức năng riêng của nó để phạm vi của chúng có thể được giải phóng. Đây là một giải pháp tốt hơn cho một dự án lớn hơn.
var doSetup = function() {
var a = "super long string ...";
var b = "useless value";
// do stuff with a and b
};
var fn = (function() {
doSetup();
var c = "Hello, World!";
return function() {
return c;
};
})();
Nguồn
2012-01-11 08:25:43
điều gì sẽ xảy ra nếu nó không trả về c nhưng đã tham chiếu đến nó như sau: 'var fn = (function() { var a =" siêu dài chuỗi ... "; var b =" useless value " ; var c = "Xin chào, Thế giới!"; chức năng() { c = "cái gì khác"; }; })(); ' – crickeys
Vấn đề là nếu chức năng vẫn được tham chiếu, phạm vi đóng được tạo ra sẽ được giữ trong bộ nhớ. Chức năng đó thực sự không ảnh hưởng gì đến thực tế đó. –
Vì vậy, làm cách nào bạn sửa mã gốc mà bạn đã đăng để đảm bảo mã không bị rò rỉ nữa? – crickeys