Na stronie 90 Crockforda w JavaScript: The Good Parts, ma kod ma następujące elementy:Metoda enchantowania Crockforda - dlaczego zamknięcie?
String.method('entityify', function(){
var character = {
'<': '<',
'>': '>',
'&': '&',
'"': '"'
};
return function(){
return this.replace(/[<>&"]/g, function(c){
return character[c];
});
};
}());
console.log("<&>".entityify());
Czy istnieje dobry powód zamknięcia i natychmiast wywoływane funkcję zewnętrzną? Poniższa wydaje się działać tak samo dobrze:
String.method('entityify', function(){
var character = {
'<': '<',
'>': '>',
'&': '&',
'"': '"'
};
return this.replace(/[<>&"]/g, function(c){
return character[c];
});
});
W wersji Crockforda, można myślę o nim jako: 'character' ponieważ odwołuje się w zamknięciu, to kręci się w pamięci, a nie śmieci zbierane, nawet po powrocie funkcji zakrywające? Podczas gdy w mojej wersji 'character' jest - z punktu widzenia mojego kodu - wyskakuje z pamięci za każdym razem, gdy' entityify' wraca? –
@mr_c: Skutecznie, tak. W szczególności: funkcja (zamknięcie), którą zwraca przez funkcję return() {...}; 'ma odniesienie do kontekstu wykonania, w którym został utworzony (kontekst utworzony przez wywołanie' method' do wywołania zwrotnego, które on nadał)). Ponieważ obiekt funkcji nadal istnieje po wywołaniu, kontekst, do którego się odnosi, nadal istnieje. Ten kontekst ma w sobie "znak", więc "znak" nadal istnieje (nie jest zbierany śmieci). Kontekst przetrwa tak długo, jak długo ta funkcja przetrwa. –