2015-07-24 16 views
9

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 = { 
    '<': '&lt;', 
    '>': '&gt;', 
    '&': '&amp;', 
    '"': '&quot;' 
    }; 

    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 = { 
    '<': '&lt;', 
    '>': '&gt;', 
    '&': '&amp;', 
    '"': '&quot;' 
    }; 

    return this.replace(/[<>&"]/g, function(c){ 
    return character[c]; 
    }); 
}); 

Odpowiedz

9

Robiąc to tak robił, tworzy character obiekt raz i ponowne wykorzystanie go. Za pomocą edycji można ją odtworzyć za każdym razem. Można to argumentować w dowolny sposób, ale na tym polega różnica. Jego używa ułamkowo więcej pamięci. Pozdrawiam trwa fractionally już za rozmowy (być może, w zależności od tego, czy tworzenia obiektu trwa dłużej niż dodatkowym etapie zakres przemierzania jego ma, to prawdopodobnie robi, chociaż). W żadnym z tych przypadków nie jest to coś, co można zauważyć w realnym świecie.

+0

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? –

+1

@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. –