Trên trang 90 của JavaScript Crockford: The Good Parts, ông có mã có sau đây:Phương thức xác thực của Crockford -khi đóng cửa?
String.method('entityify', function(){
var character = {
'<': '<',
'>': '>',
'&': '&',
'"': '"'
};
return function(){
return this.replace(/[<>&"]/g, function(c){
return character[c];
});
};
}());
console.log("<&>".entityify());
Có một lý do chính đáng cho việc đóng cửa và ngay lập tức gọi chức năng bên ngoài? Sau đây dường như chỉ làm việc cũng như:
String.method('entityify', function(){
var character = {
'<': '<',
'>': '>',
'&': '&',
'"': '"'
};
return this.replace(/[<>&"]/g, function(c){
return character[c];
});
});
Với phiên bản của Crockford, tôi có thể nghĩ nó là: vì 'ký tự' được tham chiếu trong một đóng, nó treo trong bộ nhớ và không phải là rác thu thập được, ngay cả khi hàm trả về? Trong khi với phiên bản của tôi, 'ký tự' là-từ quan điểm mã của tôi của xem -wiped từ bộ nhớ mỗi lần' entityify' trả về? –
@mr_c: Có hiệu lực, có. Cụ thể: Hàm (đóng) mà anh ta trả về thông qua 'hàm trả về() {...};' có tham chiếu đến ngữ cảnh thực thi mà nó được tạo ra (ngữ cảnh được tạo bởi lời gọi 'method' để gọi lại). Vì đối tượng hàm tiếp tục tồn tại sau khi cuộc gọi, bối cảnh nó đề cập tiếp tục tồn tại. Ngữ cảnh đó có 'ký tự' trong đó, vì vậy' ký tự' tiếp tục tồn tại (không phải là thu thập rác). Bối cảnh sẽ tồn tại miễn là chức năng đó tồn tại. –