На странице 90 JavaScript Крокфорд в: The Good Parts, он имеет код имеет следующее:Способ сужения морщин Крокфорда - почему закрытие?
String.method('entityify', function(){
var character = {
'<': '<',
'>': '>',
'&': '&',
'"': '"'
};
return function(){
return this.replace(/[<>&"]/g, function(c){
return character[c];
});
};
}());
console.log("<&>".entityify());
Есть хорошая причина закрытия и немедленно вызывается внешняя функция? Далее, кажется, работает точно так же:
String.method('entityify', function(){
var character = {
'<': '<',
'>': '>',
'&': '&',
'"': '"'
};
return this.replace(/[<>&"]/g, function(c){
return character[c];
});
});
С версией Крокфорда я могу думать об этом как о том, потому что символ «символ» упоминается в закрытии, он висит в памяти и не собирает мусор даже после того, как возвращается закрывающая функция? В то время как с моей версией «символ» - с точки зрения моего кода - вызывается из памяти каждый раз, когда возвращается «сущность»? –
@mr_c: Эффективно, да. В частности: функция (закрытие), которую он возвращает через функцию return() {...}; 'имеет ссылку на контекст выполнения, где он был создан (контекст, созданный вызовом' method' обратного вызова, который он ему дал). Поскольку объект функции продолжает существовать после вызова, контекст, на который он ссылается, продолжает существовать. Этот контекст имеет в нем «символ», поэтому «символ» продолжает существовать (не собирается мусор). Контекст сохранится до тех пор, пока эта функция сохранится. –