2015-07-24 1 views
9

На странице 90 JavaScript Крокфорд в: The Good Parts, он имеет код имеет следующее:Способ сужения морщин Крокфорда - почему закрытие?

String.method('entityify', function(){ 

    var character = { 
    '<': '&lt;', 
    '>': '&gt;', 
    '&': '&amp;', 
    '"': '&quot;' 
    }; 

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

console.log("<&>".entityify()); 

Есть хорошая причина закрытия и немедленно вызывается внешняя функция? Далее, кажется, работает точно так же:

String.method('entityify', function(){ 

    var character = { 
    '<': '&lt;', 
    '>': '&gt;', 
    '&': '&amp;', 
    '"': '&quot;' 
    }; 

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

ответ

9

Делая это, как он сделал, он создает объект characterраз и использует ее. С вашим редактированием вы каждый раз воссоздаете его. Вы можете поспорить об этом в любом случае, но в этом разница. Его использует дробно больше памяти. Ваш принимает дробно дольше за звонок (возможно, зависит от того, будет ли создание объекта занимать больше времени, чем у его дополнительного шага обхода области, но, вероятно, это делает). В любом случае это вряд ли будет тем, что вы заметили бы в реальном мире.

+0

С версией Крокфорда я могу думать об этом как о том, потому что символ «символ» упоминается в закрытии, он висит в памяти и не собирает мусор даже после того, как возвращается закрывающая функция? В то время как с моей версией «символ» - с точки зрения моего кода - вызывается из памяти каждый раз, когда возвращается «сущность»? –

+1

@mr_c: Эффективно, да. В частности: функция (закрытие), которую он возвращает через функцию return() {...}; 'имеет ссылку на контекст выполнения, где он был создан (контекст, созданный вызовом' method' обратного вызова, который он ему дал). Поскольку объект функции продолжает существовать после вызова, контекст, на который он ссылается, продолжает существовать. Этот контекст имеет в нем «символ», поэтому «символ» продолжает существовать (не собирается мусор). Контекст сохранится до тех пор, пока эта функция сохранится. –

Смежные вопросы